当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基础之子类父类属性覆盖的更多相关文章

  1. java基础:子类-父类构造器关系

    前提:父类:Parent.java 构造:默认构造方法(无参).带参数构造方法(并存时,需要显示创建无参构造方法) 例如:public Parent(){}.public Parent(String ...

  2. Java基础--重写(Overriding,覆盖)-重载(Overloading)

    多态性: Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法 Java的方法重写, ...

  3. [Java] 继承中,父类被覆盖的成员变量、方法的可访问性

    在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...

  4. 六、java基础-单例模式_继承_覆盖_多态

    1.单例模式: 1)提出原因 是由gof 也就是四人组提出来的.为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销.因为外面程序可以通过new的方法直接调用类里面的构造方法 ...

  5. java基础 super 子类调用父类

    如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...

  6. Java基础-重写-子类重写父类中的方法后执行情况

    代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.o ...

  7. Java基础-继承-子类与父类执行顺序

    代码 public class Test { public static void main(String[] args) { new Circle(); } } class Draw { publi ...

  8. Java基础系列 - 子类继承父类,调用父类的构造函数

    package com.test7; public class test7 { public static void main(String[] args) { Son son = new Son(1 ...

  9. Java基础知识(重载和覆盖)

    重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重 ...

随机推荐

  1. 解决debian中脚本无法使用source的问题

    #!/bin/sh source scripts/common.sh 现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l `which s ...

  2. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  3. [转]AutoResetEvent 与 ManualResetEvent区别

    在C#多线程编程中,这两个类几乎是不可或缺的,他们的用法/声明都很类似,那么区别在哪里了? Set方法将信号置为发送状态 Reset方法将信号置为不发送状态 WaitOne等待信号的发送 其实,从名字 ...

  4. Node之集群

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  5. c3p0配置

    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&q ...

  6. PowerDesigner的安装和数据库创建(转载)

    此文描述详细,特此转载,仅复制了大部分内容,可参考原文CodeSmith和PowerDesigner的安装和数据库创建(原创) 请大家不要用于商业用途哈,要支持正版,大家都是做软件的,知道开发一套软件 ...

  7. HTML-DIV布局

    <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content= ...

  8. 怎样计算一个整数的位数&并把每一位上的数字保存下来

    用循环来解决~~ M每次除以10, 再用一个变量count来计数,每循环一次 加1,直到这个数除去10后的数小于10 ,count再加1就可以了 实例:整数M=4325, 第一次:4325/10=43 ...

  9. Java中处理异常throw和throws

    1.首先我们来了解什么是异常呢? 异常阻止当前方法或作用域继续执行的问题. 2.处理异常 说到处理异常,我们当然会想到 try catch finally 在java中我们会对异常的处理有更高的认识 ...

  10. java微信开发

    所谓的微信开发就是在微信开发模式之下,对微信进行公众号和企业号的扩展开发.     如果要让你的微信公众号有更多的功能,比如菜单支持,自动的信息服务,查询,消息推送等,就必须开启微信的开发模式.进入微 ...