public class Employee {
public static String superStr = "SUPERSTR";
public String test() {
return "SUPERTEST";
}
public String test2() {
return "SUPERTEST2";
}
}
public class Manager extends Employee {
public static void main(String[] args) {
System.out.println(superStr);// 直接访问父类域
Manager mgr = new Manager();
String t1 = mgr.test();// 直接访问父类方法
String t2 = mgr.test2();// 覆盖父类方法
System.out.println(t1 + "\n" + t2);
}
@Override
public String test2() {
return super.test2() + "#test2";
}
} 父类Employee有public的域和方法,子类Manager覆盖了父类的一个方法。从代码中的注释可清楚地知道:子类可直接访问父类的公有域或方法,但若子类覆盖了父类的域或方法,就按覆盖的本意来。输出结果:
SUPERSTR
SUPERTEST
SUPERTEST2#test2
简单来说,上面的Manager继承Employee后,它的代码实质上等同于:
public class Manager extends Employee {
//***********父类域**************************
public static String superStr = "SUPERSTR";
public String test() {
return "SUPERTEST";
}
/*public String test2() {
return "SUPERTEST2";
}*/
//***********父类域**************************
public static void main(String[] args) {
System.out.println(superStr);// 直接访问父类域
Manager mgr = new Manager();
String t1 = mgr.test();// 直接访问父类方法
String t2 = mgr.test2();// 覆盖父类方法
System.out.println(t1 + "\n" + t2);
}
@Override
public String test2() {
return super.test2() + "#test2";
}
}
继承设计技巧:
1)将公共操作和域放置在超类
2)不要使用受保护的域(protected)
3)使用继承实现"is-a"关系
4)除非所有继承的方法都有意义,否则不要使用继承
5)在覆盖方法的时候,不要改变预期的行为
6)使用多态,而非类型信息
7)不要过多地使用反射
本文通过实例解析Java中子类如何直接访问父类的公有域和方法,并详细说明了当子类覆盖父类方法时的行为。同时,提供了继承设计技巧,包括将公共操作和域放在超类中、避免使用受保护域、遵循is-a关系等,旨在提高代码的可维护性和复用性。
11万+

被折叠的 条评论
为什么被折叠?



