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独自的构造器,同时,对相关方法进行相应的调用。
分享到:
相关推荐
如果一个类继承一个父类,那么子类会拥有父类所规定的所以成员 子类还可以拥有父类没有的独有成员 ...声明父类变量,实例化子类对象 Person p = new Student(); p.personshow();//说明不可以调用子类的方法,还是父类
标题"EnumTest--构造顺序:父类、类成员变量、子类"指的是枚举实例的构造过程,它遵循以下顺序: 1. **父类构造器**:首先,如果枚举类继承了其他类,那么会先调用父类的构造器。这是面向对象编程中的一个基本规则...
在 C++ 中,子类构造函数的初始化涉及到父类构造函数的调用,否则将无法正确地初始化从父类继承来的成员变量。本文将详细介绍 C++ 子类构造函数初始化及父类构造初始化的使用。 首先,我们需要了解构造函数的基本...
重写父类的方法需要遵守“两同两小一大”原则:方法名相同、参数列表相同、声明抛出的异常类更小或者相等、子类返回值类型比父类更小或者相等、子类重写方法的访问权限比父类方法更大或者相等。 重写与 private ...
方法覆盖发生在子类中,子类定义一个与父类同名且参数列表完全相同的方法,以改变或扩展父类的方法行为。 **this关键字** `this`关键字用于引用当前对象,常用于区分成员变量和局部变量,或者在构造器中调用其他...
1. **成员变量覆盖:** 在子类中声明与父类同名的成员变量称为覆盖,但这种覆盖不会影响到父类的成员变量。 2. **静态绑定:** 成员变量的绑定是在编译时期确定的,因此成员变量总是按照其在类中的声明进行访问。 3....
成员变量隐藏是指子类需要对从父类继承来的成员变量重新加以定义,使父类和子类的变量名称相同。 方法重写是指子类中定义的一个方法,其名称、返回类型及参数定义正好与父类中某个方法的名称、返回类型及参数定义...
5. **子类的非静态变量和非静态初始化块**:紧接着父类构造器执行后进行初始化。 6. **子类的构造器**:最后执行,用于完成子类对象的构建。 #### 四、示例分析 为了更好地理解这些概念,我们可以参考文章中给出的...
如果父类没有无参构造器,那么在子类构造器中必须显式调用父类的有参构造器,使用super参数传递必要的值。 其次,子类构造器的执行顺序。当一个子类对象被创建时,构造器的调用顺序是:首先执行父类的构造器,然后...
1. 首先,会查找父类中是否有静态变量和静态初始化块,并按照声明顺序依次执行。 2. 接着,执行子类中的静态变量和静态初始化块。 3. 此时,父类的类加载过程结束,接下来进行父类对象的实例化过程。父类的实例变量...
例如,在父类中声明了一个private的成员变量,那么在子类中将无法访问该成员变量。 在Java中,private成员变量或方法只能在同一个类中访问,这意味着子类不能访问父类中的private成员变量或方法。这可以帮助保护...
这意味着如果子类中有与父类相同的静态变量名称,则子类的静态变量与父类的静态变量实际上是两个不同的变量。当我们通过类名访问这些变量时,实际上是在访问当前类的静态变量。 - **静态方法的继承与覆盖**:静态...
继承的基本知识包括使用 extends 关键字实现类间的继承关系、声明中没有使用 extends 的类都是 Object 类的子类、Java 不支持多重继承,一个类只有一个父类等。 在 Java 中,父类和子类的关系是非常重要的。子类...
3. **初始化**:类变量的初始化在类的加载阶段进行,通常通过`static`初始化块或者直接在变量声明时赋值。静态初始化块会在类加载时首先执行,用于执行类变量的初始化逻辑。 4. **内存分配**:类变量存储在方法区...
然而,有时候父类中的一些方法可能并不完全适用于所有子类,或者需要在子类中进行一些额外的操作。这时,我们可以通过`override`关键字来覆盖父类的方法。比如: ```java public class Parent { public void ...
为了获取父类的所有属性,我们需要使用`Class`对象的`getDeclaredFields()`和`getFields()`方法,这两个方法分别返回类声明的所有字段(包括私有字段)和所有公有字段。但是,这些方法只能获取当前类的字段,不能...
类的继承通过`extends`关键字实现,一个子类可以声明其父类,如`public class ChildClass extends ParentClass`。继承的目的是为了代码重用和创建特定类型的类,子类不仅继承了父类的状态(成员变量)和行为(方法)...
在C++编程中,类继承是一种重要的面向对象特性,它允许子类继承父类的属性和方法,从而实现代码的重用和扩展。本实例主要探讨了如何在子类中调用父类的构造函数,以便正确初始化父类的数据成员。 首先,我们来看...
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统...