package test;
class A{
public String field1 = "A.field1";
protected String field2 = "A.field2";
String field3 = "A.field3";
private String field4 = "A.field4";
public String toString(){
return "public field : " + field1 + " protected field : " + field2
+" default field : " + field3 + " private String field : " + field4 ;
}
void toSay(){
System.out.println("I am a default method in A!");
}
/* public void toSay(){
System.out.println("I am a public method in A!");
}*///父类方法的访问的权限不得高于子类的覆写的方法的访问权限
}
/**
* 在这里我可以做出一个结论 ,所谓的继承其实就是子类对象拥有父类的对象的一个引用,也就是super关键在,在调用
* 子类继承了父类的方法的时候如果没有该方法没有被覆写,那么就是用父类对象的引用去调用相应的方法。
* 如果方法被覆写那么就会调用子类中覆写后的方法,哪怕就是我们不知道真实的子类对象的类型,那么在运行的时候通过保存在
* 子类对象中的类型信息,也能动态的调用子类的对象覆写后的方法。但是在子类中覆写父类的方法的方法的访问权限不得低于父类
* 的方法访问的权限,否则编译器出错。 见方法 toSay
* 不同的是对于子类对象中的实例变量和父类中的实例变量,因为子类的实例变量是对象的组成,因此分布在堆中不同的内存空间中,
* 也就是拥有不同的内存的地址。因此只要在子类中定义了与父类相同名称的实例变量,那么父类的实例变量就会被覆盖(不管双方的访问权限,不管覆盖的变量的类型),除非我们
* 通过super(子类对象中保存的父类对象的引用)来调用父类实例变量。当然对于实例变量的调用是不可以多态的,只要子类对象被提升未父类对象,
* 那么我们就只可以调用父类对象的实例变量,究其原因是因为实例变量的调用关系是在编译的时候确定的,而不像方法的调用是在运行时动态确定的。
*
* @author vagasnail
*
2009-4-17 下午02:33:56
*/
class AA extends A{
public String field1 = "AA.field1";
void toSay(){
System.out.println("I am a default method in AA!");
}
/* void toSay(){
System.out.println("I am a default method in AA!");
} // Error here : Cannot reduce the visibility(可见度) of the inherited(继承的方法) method from A
*/
}
public class TestOverrideAttr {
public static void main(String[] args) {
A a = new A();
a.toSay(); //output : I am a default method in A!
System.out.println(a.field1);
// System.out.println(a);
A aa1 = new AA();
aa1.toSay(); //output : I am a default method in AA!
System.out.println(aa1.field1);
//System.out.println(aa1);
AA aa2 = new AA();
aa2.toSay();//output : I am a default method in AA!
System.out.println(aa2.field1);
/* System.out.println(aa2);
* output:由于在子类中没有覆写基类中的toString()方法,因此这里还是用基类的引用调用的基类的toString()方法。
* public field : A.field1 protected field : A.field2 default field : A.field3 private String field : A.field4
*/
}
}
分享到:
- 2009-04-17 15:01
- 浏览 1145
- 评论(0)
- 论坛回复 / 浏览 (0 / 1483)
- 查看更多
相关推荐
方法重写又称方法覆盖。 (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类...
以下页面在运行中,调试输出的永远是alter('1'),原因是按照页面加载从上至下的顺序,同名的方法以最后一个为准.
主要介绍了Java的覆写操作,结合实例形式分析了java属性覆写及super调用父类方法覆写相关操作技巧,需要的朋友可以参考下
行业分类-设备装置-一种数据覆写方法
今天小编就为大家分享一篇pytorch ImageFolder的覆写实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了php实现parent调用父类的构造方法与被覆写的方法,在上一篇关于使用类继承解决代码重复问题的基础上,进一步分析了parent调用父类的构造方法与被覆写的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
移动互联网应用
/**一个类实现了两个接口,两个接口中的方法相同,这个类在覆写的时候就会出现冲突*/ class D: B,C{ //当下面两个方法同时存在的时候,就会报方法相同的冲突 override fun x(): Int { return super
主要介绍了Spring Cloud 覆写远端的配置属性的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
覆写
Spring Cloud 覆写远端的配置属性
Android 自定义view,覆写onMeasure例子
类的继承格式、继承的关系表示图、访问限制、子类对象的实例化过程、方法的覆写、属性的覆盖、Super关键字、this与super的区别
覆写Feign的默认配置-代码部分-代码部分.zip 覆写Feign的默认配置-代码部分博文中,优化后的服务消费者和服务提供者,以及Eureka Server、父级工程的源代码
硬盘客体重用的安全等级保护覆写机制研究,清除
本文实例讲述了PHP设计模式之模板方法模式。...注意: 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。 注意: 抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性