1、抽象類
抽象類和接口也是多態的體現方式
抽象類:類中沒有足夠信息描述具體的對象,這樣的類稱為抽象類
抽象類分兩種展現方式 abstract class一種是接口 interface
2、abstract class 一般描述為抽象類 interface 一般描述為接口
抽象類定義
注意:在抽象類中的方法不一定是抽象方法,但是含有抽象方法的類必須被定義成抽象類
區別和對比: 1.abstract class在 Java 語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface?!? 2.在abstract class中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的, 不 過在 interface中一般不定義數據成員),所有的成員方法都是abstract的。3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。 4.實現抽象類和接口的類必須實現其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現方法?!? 5.接口中定義的變量默認是public static final型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是 friendly型,其值可以在子類 中 重新定義,也可以重新賦值。 6.接口中的方法默認都是 public,abstract類型的。
3、內部類 內部類就是定義在外部類中的類,類名不與文件名相同,可以是靜態static的,也可以是其他修飾符內部類一旦編譯成功就和外部類成為不同的兩個類,區別為outer.class和outer$inner.class兩類成員內部類:外部類的成員,必須先創建了外部類對象 才能創建成員內部類對象 不可以有static數據和屬性局部內部類:定義在方法和作用域內的類,在作用域的范圍內有效靜態內部類:定義為static的內部類,可以有static數據和屬性匿名內部類:沒有名字而且只能使用一次的內部類,必須繼承一個父類或者實現一個接口
附件
1、抽象類
package com.vivi.study.abstracttest;abstract class AbstractHello { PRivate String type; // 抽象方法 只聲明 不實現 交給繼承者實現 abstract void method1(); void method2(){ System.out.println("我是非抽象方法"); };}2、抽象類子類 包含內部類 在內部類測試代碼中展現package com.vivi.study.abstracttest;/* * 抽象類子類 * 實現父類方法 * 成員內部類 * 靜態成員內部類 * 局部內部類 */public class AbstractHelloSub extends AbstractHello{ @Override void method1() { System.out.println("實現父類抽象方法 "); } public subClass getSubClass(){ return new subClass(); } // 成員內部類 public class subClass{// 不能含有static 變量和方法 會報錯// public static int age=1; public int getSubName() { return subName; } public void setSubName(int subName) { this.subName = subName; } private int subName; public void subMethod(){ System.out.println(""); } }// 局部內部類 定義在方法中的內部類 public void getClassMethod(int mage){ class SubClassInMethod{ public SubClassInMethod(int age){ this.setAge(age); System.out.println("局部內部類演示"+age); } private int age; public int getAge() { return age+2; } public void setAge(int age) { this.age = age; } } SubClassInMethod mSubClassInMethod=new SubClassInMethod(3); System.out.println("局部類方法調用"+mSubClassInMethod.getAge()); } // 靜態內部類 可以有靜態變量和靜態方法 public static class staticSubClass{ public static int age=1; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void getMName(String name1){ System.out.println("來自靜態內部類的"+name1); } }}3、抽象類測試package com.vivi.study.abstracttest;public class TestAbsctract { public static void main(String[] args) { // 抽象類不能直接創建對象 否則編譯不通過 // Cannot instantiate the type AbstractHello// AbstractHello abstractHello1=new AbstractHello(); // 抽象類可以通過對象引用指向非抽象子類對象 // 類比下動態綁定就知道了 父類 父類引用 =new 子類(); 這也是多態的一種形式 AbstractHello abstractHello2=new AbstractHelloSub(); abstractHello2.method1(); // 但是抽象類 可以通過 隱式內部類重寫其抽象方法來new對象 AbstractHello abstractHello3=new AbstractHello() { @Override void method1() { System.out.println("抽象類創建對象 無法通過編譯"); } }; abstractHello3.method1(); }}4、接口類
package com.vivi.study.abstracttest;public interface InterfaceHello { /* * 不能有成員方法 * 不能有靜態代碼塊 * 對行為(方法)抽象 * 使用implement */ int type=1;//相當于 public static final int type=1; void sayHello();// 相當于abstract void sayHello();}5、接口實現類
package com.vivi.study.abstracttest;public class InterfaceHelloSub implements InterfaceHello{ @Override public void sayHello() { System.out.println("來自接口的public static final變量"+InterfaceHello.type); }}6、接口 抽象類 內部類測試package com.vivi.study.abstracttest;public class InterfaceAndAbstractTest { public static void main(String[] args) { // 內部類測試 //1、匿名內部類 //內部類 接口方式==動態引用,將InterfaceHelloSub實例向上轉型為InterfaceHello的引用 InterfaceHello interfaceHello0=new InterfaceHelloSub() ; interfaceHello0.sayHello(); //匿名內部類 接口方式 InterfaceHello interfaceHello=new InterfaceHello() { @Override public void sayHello() { System.out.println("匿名內部類 接口方式"); } }; interfaceHello.sayHello(); //內部類 抽象類方式==動態引用,將AbstractHelloSub實例向上轉型為AbstractHello的引用 AbstractHello abstractHello0=new AbstractHelloSub() ; abstractHello0.method1(); //匿名內部類 抽象類形式 abstract 類 AbstractHello abstractHello=new AbstractHello() { @Override void method1() { System.out.println("匿名內部類 抽象類形式 abstract 類"); } }; abstractHello.method1(); // 2、成員內部類 // 成員內部類需要先創建了外部類,才能創建它自己的// AbstractHelloSub.subClass sub=new AbstractHelloSub.subClass(); 這個會報錯 AbstractHelloSub sub1=new AbstractHelloSub(); AbstractHelloSub.subClass sub2=sub1.getSubClass(); sub2.subMethod(); // 3、局部內部類 定義在方法中的內部類 sub1.getClassMethod(2); // 4、靜態內部類 AbstractHelloSub.staticSubClass.getMName("張三"); }}
新聞熱點
疑難解答