Java基础之子类父类属性覆盖
当java的子类和父类具有相同名字的属性时,到底java是怎么处理的。
先看代码:
package com.joyfulmath.study.field;
public class Person {
public String name;
public String getName() {
return name;
}
}
package com.joyfulmath.study.field;
public class Student extends Person {
public String name;
public Student(String name)
{
this.name = name;
super.name = "Man-Person";//从此处可以看出,java可以通过this,已经super来区分子类和父类。
}
@Override
public String getName() {
return name;
}
}
package com.joyfulmath.study.factory; import com.joyfulmath.study.field.Person;
import com.joyfulmath.study.field.Student;
import com.joyfulmath.study.utils.TraceLog; public class FieldMethod implements IWorkMethod { @Override
public void startWork() {
Student st = new Student("Mark-Student");
Person p = st;
TraceLog.v(p.name+" "+st.name);
TraceLog.v(p.getName()+" "+st.getName());
} }
其实st.name不用怀疑,肯定是Mark-Student
但是p.name,已经p.getName()呢?
我们先来看p.getName(),虽然P是person,但是它实际代表的地址里面存的是Student,所以
p.getName()实际的调用结果是st.getName()一样的,也就是student的getname方法。
那p.name呢?
我们在Student里面添加一个属性,level。
public class Student extends Person {
public String name;
public int level;
public Student(String name)
{
this.name = name;
super.name = "Man-Person";
}
@Override
public String getName() {
return name;
}
}
然后还是在startwork中,用p.level,结果编译器不认识?
对呀,p是person的对象,它怎么会认识呢。
所以很显然,p只认识Person中的name,而不是Student中的name.
我们看下运行结果:
startWork: Man-Person Mark-Student [at (FieldMethod.java:13)]
startWork: Mark-Student Mark-Student [at (FieldMethod.java:14)]
验证了我们的猜测,可见属性是绑定类型的,而方法是绑定对象的。
或者说属性是在编译器就确认的,而方法是动态绑定(多态)。
Java基础之子类父类属性覆盖的更多相关文章
- java基础:子类-父类构造器关系
前提:父类:Parent.java 构造:默认构造方法(无参).带参数构造方法(并存时,需要显示创建无参构造方法) 例如:public Parent(){}.public Parent(String ...
- Java基础--重写(Overriding,覆盖)-重载(Overloading)
多态性: Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法 Java的方法重写, ...
- [Java] 继承中,父类被覆盖的成员变量、方法的可访问性
在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...
- 六、java基础-单例模式_继承_覆盖_多态
1.单例模式: 1)提出原因 是由gof 也就是四人组提出来的.为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销.因为外面程序可以通过new的方法直接调用类里面的构造方法 ...
- java基础 super 子类调用父类
如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...
- Java基础-重写-子类重写父类中的方法后执行情况
代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.o ...
- Java基础-继承-子类与父类执行顺序
代码 public class Test { public static void main(String[] args) { new Circle(); } } class Draw { publi ...
- Java基础系列 - 子类继承父类,调用父类的构造函数
package com.test7; public class test7 { public static void main(String[] args) { Son son = new Son(1 ...
- Java基础知识(重载和覆盖)
重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重 ...
随机推荐
- [Design Patterns] 4. Creation Pattern
设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...
- [Tool] 常用开发工具注册码(持续更新)
OS win10 激活 命令行 打开命令提示符( 管理员 ) 输入 slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 回车 再输入 slmgr /skms kms.xs ...
- 面向对象的JavaScript(一)命名空间
在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求良好的用户体验的网站中,如SNS,就会用到大量的JavaScrpt,有时JavaScript的 ...
- 循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- sencha gridpanel 单元格编辑
{ xtype: 'gridpanel', region: 'north', height: 150, title: 'My Grid Panel', store: 'A_Test_Store', c ...
- mssql server提示无权限
mssqlserver在查询系统视图时(如:select * from sys.syscacheobjects),有时会报出如下提示: 消息 300,级别 14,状态 1,第 1 行VIEW SERV ...
- JavaScript常用代码
页面的按钮全选: function CheckBoxAll() { //得到页面上所有input表单元素:document.getElementsByTagName( ...
- javascript: jquery.gomap-1.3.3.js
from:http://www.pittss.lv/jquery/gomap/solutions.php jquery.gomap-1.3.3.js: /** * jQuery goMap * * @ ...
- 数据库==>>数据查询基础
数据查询基础 还好吗?几天不见,甚是思念呀!笑对人生,好好生活,快快乐乐的迎接我们的美好未来吧! 好吧!抒情结束,我们一起来学习一下我们今天的主题:数据查询基础,很有意思哟.让我们来感受它的魅力吧! ...
- 【Android】Android SDK Manager更新慢/失败的问题
前言:更新下载Intel x86 Atom_64 System Image的时候总是失败,速度只有几KB,我这是10M的网啊. 最后找到一篇日志,解决了这个问题.非常感谢!其参考地址:http://w ...