java继承之属性与方法访问
来源:互联网 发布:linux日志查询命令 编辑:程序博客网 时间:2024/05/16 08:04
- 以下讨论都是基于从子类实例进行属性/方法访问出现的情况.建议先看文章-jvm解析与分派
1.从父类方法(未重写)访问属性时,永远都只使用父类属性.
public class Test { public static void main(String[] args) throws Exception{ F f = new S(); f.prt();// --> 返回f. }}class F{ public String share = "f"; public void prt(){ System.out.println(share); }}class S extends F{ public String share = "s";}
2.从父类方法(未重写)访问方法f时,若f在子类中重写,则使用子类的重写方法.
//这也是为什么在父类构造器中,不提倡调用可重写方法的原因,因为创建一个子对象时,需要先实例化一个父对象,此时若是调用了子类中的重写方法,则很有可能因为子对象未初始化而造成一些错误(如NullpointException).
public class Test { public static void main(String[] args) throws Exception{ F f = new S(); f.prt();// --> 返回son. }}class F{ public String share = "f"; public void prt(){ //实际调用了子类的重载方法 f(); } public void f(){ System.out.println("father"); }}class S extends F{ public String share = "s"; @Override public void f(){ System.out.println("son"); }}
- 从子类访问父类属性x(可继承)时,若该属性的同名属性在子类中有定义,则直接修改的是子类中的属性,不影响父类属性.如果子类中没有同名属性,则使用父类属性进行操作.
(1) 子重定义父类同名属性,则不影响父类属性
public class Test { public static void main(String[] args) throws Exception{ F f = new S(); f.prt();// --> 返回son. }}class F{ public String share = "f"; public void prt(){ //实际调用了子类的重载方法 showData();//打印 sss|f } void showData(){}}class S extends F{ public String share = "s"; @Override public void showData(){ //修改子类重复定义的属性无影响 share = "sss"; System.out.println(this.share+"|"+super.share); }}
(2) 子类直接使用父类的继承属性
public class Test { public static void main(String[] args) throws Exception{ F f = new S(); f.prt();// --> 返回son. }}class F{ public String share = "f"; public void prt(){ //实际调用了子类的重载方法 showData(); } void showData(){}}class S extends F{ @Override public void showData(){ //修改子类重复定义的属性无影响 share = "sss"; System.out.println(share == super.share);//打印true System.out.println(this.share+"|"+super.share);//打印 sss|sss }}
- 在父类的可访问方法中调用一个可重写方法,要谨慎,很容易使子类实现者出现错误.
错误示例,以下代码会引发一个StackOverFlow
public class Test { public static void main(String[] args) throws Exception{ F fout = new S(); fout.invoke(); }}class F{ public void invoke(){ fx(); } public void fx(){}}//在不知道父类的方法调用的情况下容易写出以下代码.//陷入无限递归中class S extends F{ public void fx(){ this.invoke(); }}
0 0
- java继承之属性与方法访问
- Java进阶之路--继承中的方法重写与属性覆盖
- java继承时多态方法与成员的访问
- JNI 之数据类型与属性和方法的访问
- java反射应用--调用方法与访问属性
- Java反射之访问私有属性或方法
- java继承之方法
- JNI开发之访问java属性方法和静态属性方法
- C++学习之成员函数的访问属性与继承属性对虚表构建的影响--个人理解
- 访问和继承属性
- 继承访问属性
- 对象、属性、方法、 封装与继承
- java--继承,访问权限,方法(课堂)
- java初学笔记之继承的原则与方法调用
- Java 子类 继承 父类 所有属性、方法
- Java 继承访问权限与初始化
- java中的继承与对象的访问
- Java继承关系与访问控制
- 八数码的启发式搜索
- 七牛---Java SDK常见问题总结
- Android之service详解
- 约瑟夫问题解决方案
- 第14周项目2-两个成员的类模板(2)
- java继承之属性与方法访问
- 关于ROS安装快而简洁的办法~适合初学者或无开发经验者“10分钟”即可搞定
- 图片拉伸
- Ubuntu 14.04 Web服务器,Apache的安装和配置
- Servlet 从小例子开始
- OpenResty学习笔记(三) 模块
- 在Android中使用SharedPreferences存储数据以实现数据共享
- java switch语句详解
- onvif学习笔记9:OSD命令学习