zoukankan      html  css  js  c++  java
  • 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)]

    验证了我们的猜测,可见属性是绑定类型的,而方法是绑定对象的。

    或者说属性是在编译器就确认的,而方法是动态绑定(多态)。

  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/deman/p/4798057.html
Copyright © 2011-2022 走看看