类的继承
2015-08-03 23:43
246 查看
从子类的角度来,子类扩展了父类;但从父类的角度来看,父类派生出了子类,也就是说
扩展和派生所秒速的是同一个动作,只是观察角度不同而已。
如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性的情形,正常情况下,
子类里定义的方法,子类属性直接访问该属性,都会访问到覆盖属性,无法访问父类被覆盖
的属性,但是在子类定义的实例中可以通过super来访问父类被覆盖的属性
覆盖BasClass的a属性。当系统创建SubClass对象时,系统会对应创建一个BaseClass
对象,其中SubClass对象的a属性为7,对应BaseClass对象的属性为5,这个数值只有在
使用super调用时才能访问到。
如果覆盖的是类属性,在子类的方法中则可以通过父类名作为调用者来访问被覆盖的类属性。
如果子类没有包含和父类同名的属性,则子类将可以继承到父类的属性,如果在子类实例方法中
访问该属性时,则无需显式使用super或父类名作为调用者。
在一个构造器中调用另一个重载的构造器使用this调用来实现,在子类构造器中调用父类构造器
使用super调用来实现。
使用super调用和使用this调用很像,区别在于super调用的是其父类的构造器,this调用的是同一个
类的构造器。因此,使用super调用父类构造器也必须出现在子类执行体的第一行,所以this调用和super
调用不会同时出现。
不管我们是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类的构造器一次,子类构造器调用
父类构造器分如下情况:
1 子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的参数列表给出对应的
构造器。
2 子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表
调用本类两一个构造器。执行本类中另一个构造器时会调用父类的构造器。
3 子类构造器执行体中没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的
构造器。
扩展和派生所秒速的是同一个动作,只是观察角度不同而已。
如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性的情形,正常情况下,
子类里定义的方法,子类属性直接访问该属性,都会访问到覆盖属性,无法访问父类被覆盖
的属性,但是在子类定义的实例中可以通过super来访问父类被覆盖的属性
package learn_20150803; public class BaseClass { public int a = 5; } package learn_20150803; public class SubClass extends BaseClass { public int a =7; public void accessOwner() { System.out.println(a); } public void accessBase() { System.out.println(super.a); } public static void main(String[] args) { SubClass sc = new SubClass(); sc.accessOwner(); sc.accessBase(); } } 运行结果: 7 5BaseClass和SubClass中都定义了名为a的实例属性,则SubClass的a实力属性将会
覆盖BasClass的a属性。当系统创建SubClass对象时,系统会对应创建一个BaseClass
对象,其中SubClass对象的a属性为7,对应BaseClass对象的属性为5,这个数值只有在
使用super调用时才能访问到。
如果覆盖的是类属性,在子类的方法中则可以通过父类名作为调用者来访问被覆盖的类属性。
如果子类没有包含和父类同名的属性,则子类将可以继承到父类的属性,如果在子类实例方法中
访问该属性时,则无需显式使用super或父类名作为调用者。
在一个构造器中调用另一个重载的构造器使用this调用来实现,在子类构造器中调用父类构造器
使用super调用来实现。
package learn_20150803; public class Base { public double size; public String name; public Base(double size,String name) { this.size = size; this.name = name; } } package learn_20150803; public class Sub extends Base{ public String color; public Sub(double size, String name,String color) { super(size, name); this.color = color; } public static void main(String[] args) { Sub s = new Sub(5.6,"hello","red"); System.out.println(s.size +" "+s.name+" "+s.color); } }
使用super调用和使用this调用很像,区别在于super调用的是其父类的构造器,this调用的是同一个
类的构造器。因此,使用super调用父类构造器也必须出现在子类执行体的第一行,所以this调用和super
调用不会同时出现。
不管我们是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类的构造器一次,子类构造器调用
父类构造器分如下情况:
1 子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的参数列表给出对应的
构造器。
2 子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表
调用本类两一个构造器。执行本类中另一个构造器时会调用父类的构造器。
3 子类构造器执行体中没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的
构造器。
package learn_20150803; public class Creature { public Creature() { System.out.println("Creature无参数的构造器"); } }
package learn_20150803; public class Animal extends Creature{ public Animal(String name) { System.out.println("Animal带一个参数的构造器,该动物的名字是:"+name); } public Animal(String name,int age) { this(name); System.out.println("Animal带两个参数的构造器,age为:"+age); } }
package learn_20150803; public class Wolf extends Animal{ public Wolf() { super("tulang",3); System.out.println("Wolf无参数的构造器"); } public static void main(String[] args) { new Wolf(); } }
运行结果: Creature无参数的构造器 Animal带一个参数的构造器,该动物的名字是:tulang Animal带两个参数的构造器,age为:3 Wolf无参数的构造器
相关文章推荐
- 自动登陆ftp服务器的批处理怎么写
- CSS3详解:transform
- OpenGL: 渲染管线理论
- C++ 函数重载
- linux tar命令
- PHP-逻辑运算符
- hd1016 Prime Ring Problem
- static /const
- POJ 1741 Tree + POJ 1987 Distance Statistics【树的点分治】
- linux编程常用的函数
- HDU 5336——XYZ and Drops——————【广搜BFS】
- 杭电2097 sky数水过
- jquery 怎么获取服务器控件ID
- 磁盘 IO 性能 调优 多线程
- mysql之日志和mysqlbinlog工具的使用
- Eclipse中的java、xml代码提示功能设置
- contiki OS 配置编译
- [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树
- Java线程的六种状态
- 转!!java中关键字volatile的作用