方法和变量在继承时的覆盖和隐藏

package com.jdk7.chapter2.converhide;

public class Parent {
    public static String kind = "com.jdk7.chapter2.Parent";    //类变量
    public static int age = 100;            //类变量
    public String name = "Parent";            //实例变量

    public static String getKind() {        //静态方法
        System.out.println("Parent获取kind值");
        return kind;
    }
    public static int getAge() {            //静态方法
        System.out.println("Parent获取age值");
        return age;
    }
    public String getName() {                //实例方法
        System.out.println("Parent获取name值");
        return name;
    }
    public final int getNextAge(){
        return ++age;
    }
}
 1 package com.jdk7.chapter2.converhide;
 2
 3 public class Child extends Parent {
 4     public static String kind = "com.jdk7.chapter2.Child";        //类变量
 5     public int age = 50;                //实例变量
 6     public String name = "Child";        //实例变量
 7     public static String getKind() {    //静态方法覆盖静态静态方法
 8         System.out.println("Child获取age值");
 9         return kind;
10     }
11     public String getName() {            //实例方法覆盖实例方法
12         System.out.println("Child获取name值");
13         return name;
14     }
15     public static String getParentKind(){        //访问父类的类变量要使用 父类名+变量名
16         System.out.println("在Child中获取Parent的kind");
17         return Parent.kind;
18     }
19     public static int getParentAge(){
20         System.out.println("在Child中获取Parent的age");
21         return Parent.age;
22     }
23     public String getParentName(){                //访问父类的实例变量要使用 super/对象名+变量名
24         System.out.println("在Child中获取Parent的name");
25         return super.name;
26     }
27     //静态方法无法被实例方法覆盖
28 //    public int getAge() {
29 //        return age;
30 //    }
31
32     //final方法无法被覆盖
33 //    public int getNextAge(){
34 //        return ++age;
35 //    }
36
37 }
 1 package com.jdk7.chapter2.converhide;
 2
 3 public class ConverHideTest {
 4     public static void main(String[] args) {
 5         Child child = new Child();
 6         System.out.println("child kind: "+child.kind+"; child age: "+child.age+"; child name: "+child.name);
 7         Parent parent = child;
 8         System.out.println("父类的静态方法被子类隐藏,可以再调用:"+parent.getKind());
 9         System.out.println("父类的实例方法被子类覆盖,无法再调用:"+parent.getName());
10         System.out.println("父类的变量被子类隐藏, parent kind: "+parent.kind+"; parent age: "+parent.age+"; parent name: "+parent.name);
11         System.out.println("子类中访问父类实例变量name: "+child.getParentName());
12         System.out.println("子类中访问父类静态变量kind: "+child.getParentKind());
13     }
14 }
15
16 执行结果:
17 child kind: com.jdk7.chapter2.Child; child age: 50; child name: Child
18 Parent获取kind值
19 父类的静态方法被子类隐藏,可以再调用:com.jdk7.chapter2.Parent
20 Child获取name值
21 父类的实例方法被子类覆盖,无法再调用:Child
22 父类的变量被子类隐藏, parent kind: com.jdk7.chapter2.Parent; parent age: 100; parent name: Parent
23 在Child中获取Parent的name
24 子类中访问父类实例变量name: Parent
25 在Child中获取Parent的kind
26 子类中访问父类静态变量kind: com.jdk7.chapter2.Parent

总结:

(1) 类变量,又叫静态变量,这种变量属于类,通过类名称就可以访问类变量。

例:

Child ->getParentKind->return Parent.kind;

(2) 实例变量,属于类的实例,即对象,通过对象可以访问实例变量,但不能通过类名访问实例变量。

例:

1.Child ->getParentName->return super.name;2.ConverHideTest->child.name

(3) 静态方法,该方法属于类,通过类名称就可以访问静态方法。

例:

1.Parent.getKind()

(4) 实例方法,属于类的实例,即对象,通过对象可以访问实例方法,但不能通过类名访问实例方法。

例:

Child child = new Child();Parent parent = child;parent.getName();

(5) 隐藏:B隐藏了A的方法或者变量,那么B不能访问A被隐藏的方法或变量,但是将B转换为A后,可以访问A被隐藏的方法或变量。

例:

Child child = new Child();Parent parent = child;parent.getKind();

(6) 覆盖:B覆盖了A的方法或者变量,那么B不能访问A被覆盖的方法或变量,但是将B转换为A后,同样不能访问A被隐藏的方法或变量。

例:

Child child = new Child();Parent parent = child;parent.getName();

在java中,变量和方法在继承时的隐藏和覆盖的原则如下:1. 父类的静态变量和实例变量能被子类同名的变量隐藏;2. 父类的静态方法可以被子类同名的静态方法隐藏;3. 父类的实例方法可以被子类同名的实例方法覆盖;4. 不能用子类同名的静态方法隐藏父类中的实例方法,否则编译会出错;5. 不能用子类同名的实例方法覆盖父类中的静态方法,否则编译会出错;6. 最终方法(带有final的方法)不能被覆盖;7. 变量只会被隐藏,不会被覆盖,子类的静态变量可以隐藏父类的实例变量,子类的实例变量也可以隐藏父类的静态变量。


原文地址:https://www.cnblogs.com/celine/p/8283702.html

时间: 2024-10-10 04:21:56

方法和变量在继承时的覆盖和隐藏的相关文章

方法和变量在继承时的覆盖和隐藏问题

作者:华清远见讲师 最近有个同学问了我一个小问题,觉得很有意思,之前一直没有想到过.他说"java中存在方法覆盖,是否存在变量的覆盖呢?".我们知道,在java中,子类可以继承父类,如果子类声明的方法与父类有重名,这时就发生了方法覆盖.其实,这实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试中还是比较常见的,所以这里来讨论下 首先我们来看几个概念 隐藏 :子类隐藏了父类的变量和方法,那么,子类不能访问父类被隐藏的变量或者方法,但是,将

JAVA中方法和变量在继承中的覆盖和隐藏

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题. 隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法 覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问par

JAVA中方法和变量在继承中的覆盖和隐藏(一)

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下 首先我们来看几个概念 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例,即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:通过类名访问. 实例方法:对象访问,

Java中如何访问同名的方法或变量 ?

/* 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:方法属于类,通过对象访问实例方法,不能通过类名访问实例方法. 隐藏:B隐藏了A的变量或者方法,那么,B不能访问A被隐藏的变量或方法,但是,将B转换成A后,可以访问A被隐藏的变量或方法. 覆盖:B覆盖了A的变量或者方法,那么,B不能够访问A被覆盖的变量或方法,将B转换成A后,同样不能访问A被覆盖的变量或方法. Java中方法和变量

关于继承时子类重写父类方法和覆盖父类变量的若干问题

假设,子类重载父类的方法,并将子类的成员覆盖. 创建子类对象实例,将其上转型成父类. 例子1 public class Parent { public void init() { System.out.println("1 init parent"); this.demo(); } public void demo() { System.out.println("2 demo parent"); } } public class Son extends Parent

java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐藏变量,这样会让代码难以阅读 覆盖和隐藏方法 对象实例方法 在一个对象实例方法中,如果子类有一个方法,它的签名(方法名字,方法的参数个数和类型)和返回值都和父类一样,那么就是覆盖父类的方法.子类覆盖的能力,允许一个类,继承父类的行为,根据需要修改某些行为.覆盖的方法,和父类对应的方法有一样的名字,一

JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有23种设计模式,解决某一问题最有效的方法 单例设计模式 解决一个类在内存中只存在一个对象 想要保证对象唯一该怎么做> 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 2.还为了让其他程序访问到该类对象,只好在本类中自定义一个对象 3.为了方便其他程序对自定义对象的访问,可以对外提供

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中可以增加域,增加方法或者覆盖超类的方法,然而绝对不能删除继承的任何域和方法. 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性

C++父子类继承时的隐藏、覆盖、重载

存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承关系: 子类复制父类全部成员 首先,理解父子类的继承关系是怎样发生的.在此基础上就很容易理解它们之间的关系和区别. 每一个类有它自己的成员变量和成员函数,是一个独立的空间整体.当子类继承父类时,会将父类的全部成员全部复制一份,作为子类的成员,但是,同时也会标记这些成员是从父类中继承的,与子类本身的成