1、java抽象类与接口的自学入门abstract class A public abstract void f();class B extends A public void f() System.out.println(哈哈); public class TestAbs_1 public static void main(String args) /A aa1 = new A(); /error A aa2 = null; /可以定义一个抽象类的引用 aa2 = new B(); /将子类对象的地址赋给抽象类的引用 aa2.f(); /用抽象类的引用访问子类的方法 这就是多态 abstract
2、 class A /如果f方法没有方法体,则必须的在class前加 abstract 如果f方法含有方法体,则class前面可加也可不加abstract ,因为“一个抽象类中是可以不包含任何抽象方法,尽管比较少见” private int i; public abstract void f(); /如果f方法没有方法体,则f方法必须的声明为抽象方法,即必须的在前面加abstractclass TestAbsClass_1 public static void main(String args) System.out.println(今天我很高兴!); /* 不能new 出抽象类对象,但可以用抽
3、象类的引用指向抽象类的子类对象,即抽象类也可以实现多态*/abstract class A abstract public void f();class B extends A public void f() System.out.println(BBB); public class TestAbsClass_2 public static void main(String args) /A aa = new A(); /error 不能new 出抽象类对象 A aa = new B(); /OK aa.f(); /多态 class A /如果在class前面加final 编译时程序就会报错c
4、lass B extends Apublic class TestFinal_1 public static void main(String args) class A /如果在class前面加final 编译时程序就会报错class B extends Apublic class TestFinal_1 public static void main(String args) /* final类型修饰的属性必须在定义的同时初始化 如果final类型修饰的属性没有在定义的同时初始化,则必须在该类中的所有构造函数中完成初始化 不过这两种初始化只能存在一种,否则编译时会报错!因为final表示常
5、量的意思,常变量当然不能被初始化两次了*/class Point int x; final double PI = 1.9; /10 final定义的变量必须在定义的同时初始化 如果这里只定义不初始化则我们就必须在所有的构造函数中完成对final变量的初始化 不过这两种方式只能选择其中的一种 Point() /PI = 1.234; /只要10行对PI进行了初始化,本语句就必须的被注释掉,否则编译时会报错! Point(int m, int n) /PI = 2.33; /只要10行对PI进行了初始化,本语句就必须的被注释掉,否则编译时会报错! void output() /PI = 2; /
6、error 因为“一个类的所有方法内部都不可以修改final修饰过的成员变量的” System.out.printf(%d %fn, x, PI); public static void main(String args) Point pt = new Point(); pt.output(); /* 在JDK 1.6中的运行结果是:-0 1.900000-*/* 接口中定义的属性的值在实现类中不能被更改 接口的属性是public static final 类型*/接口中是不可以定义构造函数的interface It int i = 10; /不能改为 int i;class A implem
7、ents It public A(int j) /this.i = j; / 接口It中的属性i 是public static final 类型,不可以在实现类中被改变 class TestInter_1 public static void main(String args) A aa = new A(10); System.out.println(aa.i = + aa.i); System.out.println(aa.i = + A.i); class Ainterface It1interface It2 /接口可以多重继承,即一个接口可以有多个父接口,但是一个类只能有一个父类,Ja
8、va类不允许多继承,接口却允许多继承interface It3 extends It1, It2interface It4 int i = 20;/一个类可以在继承一个父类的同时实现一个或多个接口,但extends关键字必须的在implements 之前class T extends A implements It4,It3class TestInter_2 public static void main(String args) System.out.println(嘿嘿!); class A public void f() System.out.printf(AAAAn); class B
9、 extends A public void f() /重写方法的权限不能低于被重写方法的访问权限 System.out.printf(BBBBn); public class TestA public static void main(String args) B bb = new B(); /bb.f(); A aa = new A(); aa.f(); aa = bb; aa.f(); /(*aa).f(); /bb = aa; /error class A public void f() System.out.printf(AAAAn); class B extends A publi
10、c void f() System.out.printf(BBBBn); public class TestA_2 public static void main(String args) A aa = new A(); B bb = new B(); aa = bb; /bb = aa; /error bb = (B)aa; bb.f(); aa.f(); abstract class A abstract public void f();class B extends A public void f() System.out.printf(BBBBn); public class Test
11、AbsPoly_1 public static void main(String args) /A aa = new A(); /error 18行 B bb = new B(); /OK bb.f(); /OK A aa; /23行 OK 可以定义一个抽象类的引用,但是不可以定义一个抽象类的对象,所以18行error, 本行OK aa = bb; aa.f(); /有抽象方法的类一定是抽象类abstract class A abstract public void f(); /没有方法体的方法叫做抽象方法, 抽象方法要求末尾必须得加分号,前面必须得加abstract/抽象类不一定有抽象方法a
12、bstract class B public void g() public class TestAbstract_1 public static void main(String args) class A final public int i = 10; /常变量 public A() i = 10; public void f() /i = 22; class TestFinal_1 public static void main(String args) class A final public void f() /如果在public前面加final,则编译时就会报错 System.o
13、ut.println(AAAA); class B extends A/ public void f()/ / System.out.println(BBBB);/ public class TestFinal_2 public static void main(String args) class A public void f() System.out.printf(AAAAn); class B extends A public void f() System.out.printf(BBBBn); class C extends B public void f() System.out.
14、printf(CCCCn); class D extends C public void f() System.out.printf(DDDDn); public class TestPoly_1 public static void g(A aa) aa.g(); /类似于C语言的: (*aa).f(); public static void main(String args) A aa = new A(); B bb = new B(); C cc = new C(); D dd = new D(); g(aa); g(bb); g(cc); g(dd); class A public void f() System.out.printf(AAAAn); class B extends A public void f() System.out.printf(BBBBn); public void g() System.out.printf(GGGGn); public class TestPoly_2 public static void main(String args) A aa = new A(); B bb = new B(); aa = bb; aa.g(); /error (*aa).g();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1