父类子类有相同的变量声明

public abstract class A {   
  int i=1;   
  public void printI() {   
    System.out.println("i="+i);   
  }   
}   
  
public class B  extneds A{   
  int i=2;   
  public static void main(String[] args) {   
    B b=new B();   
    b.printI();   
  }   
}

那么,控制台打出来的i的值是多少? 
呵呵,如果一下功夫就能说出正确结果1,那么,下面部分就不需要往下看了。

1、类的继承知识点 
(1)java不支持多重继承,也就是说子类至多只能有一个父类 
(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 
(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承 
(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。

2、答案是2者如是说 
  子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以,打印出的结果应该是“i=2”;

3、歧义的产生 
  歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里,我觉得这两个字容易误导。应该改为屏蔽或隐藏。因为在这里父类的成员变量是没有被改变。

4、jvm的执行过程 
(1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化 
(2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。 
(3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。 
那么,在这里A的成员函数当然是访问自己的成员变量了。

5、super关键字 
super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写: 
Java代码 
public abstract class A {   
  int i=1;   
  public void printI() {   
    System.out.println("i="+i);   
  }   
}   
public class B extends A{   
    public int i=2;   
    public void printI(){   
        super.printI();   
    }   
    public static void main(String[] args){   
        B b= new B();   
        b.printI();   
           
    }   
}  
注: 
JVM实例化程序的过程中,若对子类进行实例化,必然要对父类的构造器进行实例化继承。 
C exteds D(){} 
C c = new C(); 
构造器,采取先父后子的关系。 
而方法,若调用的方法为子类所覆盖,则主动调用儿子的方法,因为此时,已经继承了父类所拥有的 
相关变量,而方法行为,子类具有相对来说的独立性,可以独立调用。

D c = new C(); 
JVM处理过程,也是如此。 
先继承D的构造器(基因),再加载C独自的构造器,同时,对相关方法进行相应的调用。

时间: 2024-10-13 13:59:26

父类子类有相同的变量声明的相关文章

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

java 父类子类成员变量,静态变量,构造器创建先后顺序

关于java中父类子类,成员变量,静态变量,构造器创建的先后顺序,在面试中经常会问到该类型的问题 所以用以下代码进行测试: public class Test { public static void main(String args[]) { Father f = new Son(); } } class Father { public Father() { System.out.println("Father Construct"); } static int fatherStat

final,static静态和非静态,初始化和代码块的区别、父类和子类中都有static变量时的初始化顺序、重写equals()、 instanceof强制转换

final:类不能被继承,方法不能被重写,属性值不能被修改(常量): 可以调用: static静态常量----- 不需要创建对象,可以直接调用类里面的属性,方法: 示例如下: 加了static说明它是属于整个类的,每个对象值都一样,如下图所示:size是静态的,所以当在下面t1对象中改变size的值时,整个类中的size值都变了:然后作为普通属性的length,当在t1对象中改变其值,并不会改变原始值: 静态方法不能调用非静态的方法和非静态的属性,也不能打印非静态的方法和非静态的属性:可以在静态

JavaSE8基础 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量 */ //基类 class Person { public int num = 1; } //子类 class Javaer extends Person { //子类中的成员变量与父类重名了 public int num

JavaSE8基础 子类中的成员变量与父类重名 简单示例

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: //基类 class Person { public int num = 1; } //子类 class Javaer extends Person { //子类中的成员变量与父类重名了 public int num = 2; public void showNum() { System.out.printl

父类和子类有相同成员变量时的例子

今天看到一个有趣的程序,如下: public class Test { public static void main(String[] args){ B b=new B(); b.bb(); } } class A{ private String a="a"; public void visit(){ System.out.println(this.a); System.out.println(this.getClass()); } } class B extends A{ priv

成员变量声明类型注意:

@public : 在任何地方都能直接访问对象的成员变量  @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private,即使声明为@public,若处在单独文件中也是@private)  @protected : 可以在当前类及其子类的对象方法中直接访问  (@interface中默认就是@protected)  @package : 只要处在同一个框架中,就能直接访问对象的成员变量  @interface和@implementation中不能

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父

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

在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. 例子: Super, 父类,拥有一个成员变量 x ,和成员方法 doSomething(). Point,继承 Super, 但覆盖了 Super 的 x 和 doSomething(),拥有自己的同名成员成员 x 和 doSomething(). StaticDemo1, 演示在继承中,在内部,可