- 覆写和隐藏: 发生在子类与父类的之间
- 覆写:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),
返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。 - 隐藏:针对父类中成员变量和静态方法而言。父类和子类存在相同的静态方法.
-
发生隐藏时,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定
- 构造函数: 创建子类对象时都会先调用父类无参构造函数,再调用子类构造函数。
验证场景:
1、本类引用本类对象
2、父类引用子类对象
3、构造函数调用
// 父类 class Swan { protected String name = "Swan"; public Swan() { System.out.println("This is Swan!"); } public static void fly() { System.out.println("Swan can fly ..."); } public void color() { System.out.println("White..."); } } // 子类 class UglyDuck extends Swan { protected String name = "UglyDuck"; // 同名成员变量 public UglyDuck() { System.out.println("This is UglyDuck!"); } public static void fly() { // 同名静态函数 System.out.println("UglyDuck can't fly ..."); } public void color() { // 同名函数 System.out.println("Grey..."); } } public class ClassTest { public static void ClassTest() { Swan swan = new Swan(); // 声明Swan引用变量swan 引用Swan的实例对象 swan.fly(); // Swan can fly ... 调用Swan对象方法 swan.color(); // White... 调用Swan对象方法 System.out.println(swan.name); // Swan 调用Swan成员变量 // 覆盖 UglyDuck uglyDuck = new UglyDuck(); // 声明UglyDuck引用变量uglyDuck 引用UglyDuck的实例对象 This is Swan!nThis is UglyDuck! uglyDuck.fly(); // UglyDuck can't fly ... uglyDuck.color(); // Grey... System.out.println(uglyDuck.name); // UglyDuck // 隐藏 Swan uglyDuck1 = new UglyDuck(); // 声明Swan引用变量uglyDuck1 引用UglyDuck的实例对象 This is Swan!nThis is UglyDuck! uglyDuck1.fly(); // Swan can fly ... 调用父类静态方法 uglyDuck1.color(); // Grey... 调用实例对象方法 System.out.println(uglyDuck1.name); // Swan 调用父类成员变量 } } 结果: This is Swan! Swan can fly ... White... Swan This is Swan! This is UglyDuck! UglyDuck can't fly ... Grey... UglyDuck This is Swan! This is UglyDuck! Swan can fly ... Grey... Swan
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)