初学java,此例子只是为了验证以下几点:
1.接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类(如接口Z继承接口Y,抽象类A实现接口Z,抽象类C继承非抽象类B)
2.抽象类可以有非抽象方法,甚至可以没有抽象方法,但是有抽象方法的类一定是抽象类(如抽象类A中的mm方法,如把方法aa注释掉也可以正常运行)
3.接口的方法必须被全部实现,抽象类的非抽象方法可不被实现(如抽象类A的非抽象方法mm可不被他的子类B实现(覆写))
4.抽象类继承某个类时,可以不实现(覆写)其方法(如抽象类C继承非抽象类B,却没有实现其方法)
5.某类型的对象只能实现其本身或比其层次更高的方法(如x2能实现yy、zz和aa等方法而不能实现方法bb)
这里我理解成算术关系:
Y>=Z>=A>=B>=C
A类型的对象只能实现大于或等于A类的方法,而不能实现小于A的
非抽象类B类的对象必须实现大于B类的类或接口的全部方法(注意第3 点)
抽象类C可以不实现所有方法,包括大于C的
1 2 3 public class test { 4 /**Z接口继承Y接口, 5 * 抽象类A继承Z接口, 6 * 非抽象类B继承抽象类A, 7 * 抽象类C继承非抽象类B*/ 8 9 public static void main(String[] args) { 10 B x1 = null; // 声明对象x1,其类型是B类 11 x1 = new B(); // 实例化对象x1 12 x1.yy(); 13 x1.zzz(); 14 x1.zz(); 15 x1.aa(); 16 x1.bb(); 17 x1.mm(); //直接调用抽象类A的非抽象方法 18 19 System.out.println("******************************"); 20 21 A x2 = new B(); //声明并实例化对象x2,x2的类型是A类 22 x2.yy(); 23 x2.zzz(); 24 x2.zz(); 25 x2.aa(); 26 //x2.bb(); // 因为此时实例化对象x2的类型是A,所以x2不能调用B类的方法,只能调用接口Y、接口Z和类A自己的方法 27 //此时方法的调用只能调用其父类、接口或父类的父类和父类的接口等以上的方法,不能调用子类的方法 28 x2.mm(); 29 } 30 }; 31 32 33 interface Y{ 34 void yy(); //接口的所有方法只能使用默认或public声明 35 }; 36 37 38 interface Z extends Y{ //接口Z继承接口Y 39 public void zz(); 40 public void zzz(); 41 }; 42 43 44 abstract class A implements Z{ //抽象类A实现接口Z,可不实现其方法 45 46 public abstract void aa(); //抽象类的抽象方法 47 48 protected static void mm() { //抽象类的非抽象方法 49 System.out.println("这是抽象类A的非抽象方法"); 50 } 51 }; 52 53 54 class B extends A { 55 56 public void bb(){ 57 System.out.println("这是B类的方法"); 58 } 59 60 public void aa() { //覆写抽象类A的抽象方法 61 System.out.println("这是A类的方法"); 62 } 63 64 public void zzz() { //覆写父类A所实现的接口Z的方法 65 System.out.println("这是Z接口的方法1"); 66 } 67 68 public void zz() { //覆写父类A所实现的接口Z的方法 69 System.out.println("这是Z接口的方法2"); 70 } 71 72 //非抽象类必须实现父类以及父类的父类或接口的方法 73 public void yy() { 74 System.out.println("这是Y接口的方法"); 75 } 76 }; 77 78 79 abstract class C extends B{ //抽象类C可以不实现父类B的方法 80 81 }
初学小白第一次发文,大家有什么其他见解请评论或联系我一起讨论哈。