java学习(七)java中抽象类及 接口
抽象類的特點(diǎn):
A:抽象類和抽象方法必須用abstract關(guān)鍵字修飾。
B:抽象類中不一定有抽象方法,但是抽象方法的類必須定義為抽象類
c: 抽象類不能被實(shí)例化,因?yàn)樗皇蔷唧w的。
? ? ?抽象類有構(gòu)造方法,但不能被實(shí)例化?構(gòu)造方法的作用是什么?
? ? ?用于子類訪問父類數(shù)據(jù)的初始化。
D:抽象的子類。
? ? ? ? 如果不想重寫抽象類的方法,該子類是個抽象類。重寫所有的抽象方法,這個時候子類是一個具體的類
抽象類Demo:
//abstract class Animal //抽象類的聲明格式 abstract class Animal {//抽象方法//public abstract void eat(){} //空方法體,這個會報錯。抽象方法不能有主體public abstract void eat();public Animal(){} }//子類是抽象類 abstract class Dog extends Animal {}//子類是具體類,重寫抽象方法 class Cat extends Animal {public void eat() {System.out.println("貓吃魚");} }class AbstractDemo {public static void main(String[] args) {//創(chuàng)建對象//Animal是抽象的; 無法實(shí)例化//Animal a = new Animal();//通過多態(tài)的方式Animal a = new Cat();a.eat();} }?抽象實(shí)例:
/*抽象類的成員特點(diǎn):成員變量:既可以是變量,也可以是常量。構(gòu)造方法:有。用于子類訪問父類數(shù)據(jù)的初始化。成員方法:既可以是抽象的,也可以是非抽象的。抽象類的成員方法特性:A:抽象方法 強(qiáng)制要求子類做的事情。B:非抽象方法 子類繼承的事情,提高代碼復(fù)用性。 */ abstract class Animal {public int num = 10;public final int num2 = 20;public Animal() {}public Animal(String name,int age){}public abstract void show();public void method() {System.out.println("method");} }class Dog extends Animal {public void show() {System.out.println("show Dog");} }class AbstractDemo2 {public static void main(String[] args) {//創(chuàng)建對象Animal a = new Dog();a.num = 100;System.out.println(a.num);//a.num2 = 200; System.out.println(a.num2);System.out.println("--------------");a.show();a.method();} } /*貓狗案例具體事物:貓,狗共性:姓名,年齡,吃飯分析:從具體到抽象貓:成員變量:姓名,年齡構(gòu)造方法:無參,帶參成員方法:吃飯(貓吃魚)狗:成員變量:姓名,年齡構(gòu)造方法:無參,帶參成員方法:吃飯(狗吃肉)因?yàn)橛泄残缘膬?nèi)容,所以就提取了一個父類。動物。但是又由于吃飯的內(nèi)容不一樣,所以吃飯的方法是抽象的,而方法是抽象的類,類就必須定義為抽象類。抽象動物類:成員變量:姓名,年齡構(gòu)造方法:無參,帶參成員方法:吃飯();實(shí)現(xiàn):從抽象到具體動物類:成員變量:姓名,年齡構(gòu)造方法:無參,帶參成員方法:吃飯();狗類:繼承自動物類重寫吃飯();貓類:繼承自動物類重寫吃飯(); */ //定義抽象的動物類 abstract class Animal {//姓名private String name;//年齡private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//定義一個抽象方法public abstract void eat(); }//定義具體的狗類 class Dog extends Animal {public Dog() {}public Dog(String name,int age) {super(name,age);}public void eat() {System.out.println("狗吃肉");} }//定義具體的貓類 class Cat extends Animal {public Cat() {}public Cat(String name,int age) {super(name,age);}public void eat() {System.out.println("貓吃魚");} }//測試類 class AbstractTest {public static void main(String[] args) {//測試狗類//具體類用法//方式1:Dog d = new Dog();d.setName("旺財");d.setAge(3);System.out.println(d.getName()+"---"+d.getAge());d.eat();//方式2:Dog d2 = new Dog("旺財",3);System.out.println(d2.getName()+"---"+d2.getAge());d2.eat();System.out.println("---------------------------");Animal a = new Dog();a.setName("旺財");a.setAge(3);System.out.println(a.getName()+"---"+a.getAge());a.eat();Animal a2 = new Dog("旺財",3);System.out.println(a2.getName()+"---"+a2.getAge());a2.eat();} }抽象類不能和那些關(guān)鍵字共存
/* 一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什么意義?A:可以。B:不讓創(chuàng)建對象。abstract不能和哪些關(guān)鍵字共存?private 沖突final 沖突 static 無意義 */ abstract class Fu {//public abstract void show();//非法的修飾符組合: abstract和private//private abstract void show();//非法的修飾符組合//final abstract void show(); //非法的修飾符組合static abstract void show();public static void method() {System.out.println("method");} }class Zi extends Fu {public void show() {} }class AbstractDemo3 {public static void main(String[] args) {Fu.method();} }接口的特點(diǎn):
A:接口用關(guān)鍵字interface表示,interface 接口名{}
B:類實(shí)現(xiàn)接口用implements 表示
? ? ? class ?類名 ?implements 接口名{}
C:接口不能實(shí)例化
? ? ?接口實(shí)例化必須按照多態(tài)的方式來實(shí)現(xiàn)實(shí)例化的
D:接口的子類:
? ? ? 可以是抽象類,但意義不大
? ? ? 可以是具體類,要重寫接口中所有抽象方法
/*接口的特點(diǎn):A:接口用關(guān)鍵字interface表示 interface 接口名 {}B:類實(shí)現(xiàn)接口用implements表示class 類名 implements 接口名 {}C:接口不能實(shí)例化那么,接口如何實(shí)例化呢?按照多態(tài)的方式來實(shí)例化。D:接口的子類a:可以是抽象類。但是意義不大。b:可以是具體類。要重寫接口中的所有抽象方法。(推薦方案)由此可見:A:具體類多態(tài)(幾乎沒有)B:抽象類多態(tài)(常用)C:接口多態(tài)(最常用) */ //定義動物培訓(xùn)接口 interface AnimalTrain {public abstract void jump(); }//抽象類實(shí)現(xiàn)接口 abstract class Dog implements AnimalTrain { }//具體類實(shí)現(xiàn)接口 class Cat implements AnimalTrain {public void jump() {System.out.println("貓可以跳高了");} }class InterfaceDemo {public static void main(String[] args) {//AnimalTrain是抽象的; 無法實(shí)例化//AnimalTrain at = new AnimalTrain();//at.jump(); AnimalTrain at = new Cat();at.jump();} }接口成員特點(diǎn):
? ?成員變量:
? ? ? ? 只能是常量,默認(rèn)飾符 ?public static final
? ?構(gòu)造方法:
? ? ? ?沒有,因?yàn)榻涌谥饕菙U(kuò)展功能的,而沒有具體存在
? ?成員方法:
? ? ? ?只能是抽象方法,默認(rèn)修飾符 ?public abstract
/*接口成員特點(diǎn)成員變量;只能是常量,并且是靜態(tài)的。默認(rèn)修飾符:public static final建議:自己手動給出。構(gòu)造方法:接口沒有構(gòu)造方法。成員方法:只能是抽象方法。默認(rèn)修飾符:public abstract建議:自己手動給出。所有的類都默認(rèn)繼承自一個類:Object。類 Object 是類層次結(jié)構(gòu)的根類。每個類都使用 Object 作為超類。 */ interface Inter {public int num = 10;public final int num2 = 20;public static final int num3 = 30;//錯誤: 需要<標(biāo)識符>//public Inter() {}//接口方法不能帶有主體//public void show() {}//abstract void show(); //默認(rèn)publicpublic void show(); //默認(rèn)abstract }//接口名+Impl這種格式是接口的實(shí)現(xiàn)類格式 /* class InterImpl implements Inter {public InterImpl() {super();} } */class InterImpl extends Object implements Inter {public InterImpl() {super();}public void show() {} }//測試類 class InterfaceDemo2 {public static void main(String[] args) {//創(chuàng)建對象Inter i = new InterImpl();System.out.println(i.num);System.out.println(i.num2);//i.num = 100;//i.num2 = 200;//System.out.println(i.num); //無法為最終變量num分配值//System.out.println(i.num2);//無法為最終變量num2分配值 System.out.println(Inter.num);System.out.println(Inter.num2);System.out.println("--------------");} }?
轉(zhuǎn)載于:https://www.cnblogs.com/chenchenphp/p/7020512.html
總結(jié)
以上是生活随笔為你收集整理的java学习(七)java中抽象类及 接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop之blockreport
- 下一篇: Windows下安装Telnet工具