JAVA成员变量的隐藏

一、如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子:

public class A {
    public int x=10;
}

public class B extends A {
    public int x=20;
}

public class C {
    public static void main(String[] args) {
        A a=new B();
        System.out.println(a.x);    //1
        B b=new B();
        System.out.println(b.x);    //2

        System.out.println(((A)b).x);   //3
    }
}

运行C类的main方法的结果为:

10
20
10

通过结果我们可以看出子类是不会覆盖父类的成员变量,我们eclipse的调试工具也能很清晰的看出在对像a中同时存在两个x的成员变量(其中一个是父类的),如下图示:

通过第1个和第3个的结果,可以得出对像对于成员的直接访问是静态邦定的 ,官方解释如下:

在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。

在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,

因为这样会使代码变得难以阅读。

对于静态方法与成员变量类似,如下:

public class A {
    public static void print() {
        System.out.println("A Static ");
    }
}

public class B extends A {
    public static void print() {
        System.out.println("B Static ");
    }

}

public class C {
    public static void main(String[] args) {
        A a=new B();
        a.print();

        B b=new B();
        b.print();
        ((A)b).print();

    }
}

结果如下:

A Static
B Static
A Static

时间: 2024-12-17 13:49:15

JAVA成员变量的隐藏的相关文章

成员变量的隐藏,方法的覆盖,super关键字

成员变量的隐藏:当父类和子类有相同的成员变量时,即定义了与父类相同的成员变量时,就会发生子类对父类变量的隐藏.对于子类的对象来说,父类中的同名成员变量被隐藏起来,子类就会优先使用自己的成员变量,父类成员隐藏. public class yincang {public static void main(String []args){ SonA son=new SonA(); son.showson(); FatherA father=new FatherA(); father.showfather

Java成员变量与属性的区别,简单最易懂的解释!!!

例一: 一个Student pojo类: public class Student{ private String name; private int age; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public int getAge(){ return this.age; } public void setAge(int age){ t

JAVA成员变量为什么不能在类体中先定义后赋值

1 package dx; 2 3 public class Test1 { 4 5 int a111;//定义成员变量(全局变量) 6 7 8 9 // a = 1;//此处若给变量赋值,会报错,JAVA所有的除定义或声明语句之外的任何语句都必须在方法内部(而方法又必须在某个类内部,不存在游离于类外部的方法或成员) 10 11 12 13 public static void main(String[] args) { 14 // TODO Auto-generated method stub

java 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块

①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为成员变量 ②通俗点说: 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享.静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期. 而实例变量取决于类的实例.每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期. 注意点: 1.JAVA中初始化

java成员变量与局部变量修饰符的区别

成员变量: 可以被 public,static ,protected,default,final修饰. 局部变量:包括方法里的和 代码块里的(静态和非静态) 可以被default, final修饰 参考: 百度搜索:代码块与成员变量 java中静态代码块中初始化静态成员变量 分享| 2015-12-31 22:18 ∮老男孩丶 | 浏览 56 次 悬赏:5 javastatic{ age = 2; }static int age = 4; 我把声明age的语句放到代码块后面,为什么没报错,执行代

4.Java成员变量和成员方法

成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下:    访问修饰符 修饰符 类型 属性名称=初始值; 访问修饰符:可以使用四种不同的访问修饰符中的一种,包括public(公共的).protected(受保护的),无修饰符和 private(私有的).public 访问修饰符表示属性可以从任何其它代码调用.private 表示属性只可以由该类中的其它方法来调用.protected 将在以后的课程中讨论. 修饰符:是对属性特性的描述,例如后面会学习到的:static.fi

java 成员变量 静态成员变量 方法 静态方法初始化顺序

Java构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类

java 成员变量与局部变量

成员变量: A:在类方法外 B:在堆内存中 C:随着对象的创建而存在,随着对象的消失而销毁 D:有默认的初始化值 局部变量: A:在方法定义中 B:在占内存中 C:随着方法的调用而存在,随着方法的调用完毕而销毁 D:没有初始化的值,使用前必须定义和赋值 匿名调用的好处: 调用完毕后就是垃圾,可以被垃圾回收起器回收

java 成员变量在内存中的存储过程

上面代码的运行结果: 1). 首先看第三行: Person p01 = new Person(); 等号左边创建类"Person"的一个变量"p01"(在内存的栈空间中创建一个“p01”): 等号右边会在堆空间中开辟一块区域来存放“p01”的,并且把地址传给“p01”: 目前类中的成员变量初始值都是默认值:1. byte/short/long/int类型的默认值为“0”:2. char类型的默认值为“空格”: