B A A/sfa100 A/sfa100 class B extends Af static int sfb=100 A/sfb1000 A/sfb 1000 int fb=10 B/sfb100 Sna void ma(i.3 Sma . B A A ral=new AO; ra Brbl=new B0; A/fa10 0 ral=rb1 A/fbl100 fb100 rbI B/b10 ma ma
class B extends A{ static int sfb=100; int fb=10; void ma(){…} } A ra1=new A(); B rb1=new B(); ra1=rb1; B A/sfb sma 1000 …… …… A/sfa 100 B/sfb 100 A A/sfb sma 1000 …… …… A/sfa 100 :B A/fb ma 100 …… …… A/fa 10 B/fb 10 :A fb ma 100 …… …… fa 10 ra1 rb1
class Af class B extends At Int a,b: int cd - rb=new BO; AOr BOi a=100 -100 必须完成父类或祖 new BO Object 0 d=0;调用A0 a=0 b=0;调用ohec0 a=100; 返回 c=-100: 返回
Constructors in Subclasses • 子类对象的成员初始化之前必须完成父类或祖 先类对象的成员的初始化,初始化的方式有两 种:隐式初始化和显式初始化 • 隐式初始化:当父类提供了默认的构造函数, 且子类的构造函数中没有显式调用父类的其它 构造函数,则在执行子类的构造函数之前会自 动执行父类的构造函数,直到执行完Object的 构造函数后才执行子类的构造函数 class A{ int a,b; A(){ a=100; } } class B extends A{ int c,d; B(){ c=-100; } } B rb=new B(); new B() A Object a=100; …… c=-100; c=0; d=0; a=0; b=0; 调用A() 调用Object() 返回 返回
Constructors in Subclasses 显式初始化:可以在子米浩函数的一 语句通过 super0或 supe class B extends A 构造函数或特定签名的intc; class At d B(int i 构 错误 int a.b: A(int c, int dt B(int i, int j, int k)t a-c, b=d super(,j) k:
Constructors in Subclasses • 显式初始化:可以在子类构造函数的第一条 语句通过super()或super(…)调用父类的默认 构造函数或特定签名的构造函数 • 当父类没有提供默认构造函数时,必须在子 类构造函数第一条语句通过super(…)完成父 类对象成员的初始化工作 class A{ int a,b; A(int c, int d){ a=c; b=d; } } class B extends A{ int c; B(int i){ c=i; } } 错误 B(int i, int j, int k){ super(i, j); c=k; }
Reference Types Compatibility 赋值兼容性规则: BRb=new BO 时,赋 值号Aral=h 号左边 的对 A ra2=new B0; a Obiect aob=ral 2) 长型必须 与方 Object strobl= new String(“good”); Object intobj =new Integer(100); 子类型 Nu对豕与所得时用天术所有 引用类型的变量都可被赋值为nul
Reference Types Compatibility • 赋值兼容性规则: (1) 对引用类型的变量进行赋值操作时,赋 值号右边的表达式的类型必须与赋值号左边 的对象引用类型相同或是其子类型 (2) 方法的return语句返回的结果的类型必须 与方法声明中的返回类型相同或是其子类型 • Null对象引用与所有的引用类型兼容,所有 引用类型的变量都可被赋值为null B rb=new B(); A ra1=rb; A ra2=new B(); Object aobj=ra1; Object strobj=new String(“good”); Object intobj=new Integer(100);