class Father{
int i=10;
public void printInfo(){
System.out.println("In Father");
}
}
class Son extends Father{
int i=20;
public void printInfo(){
System.out.println("In Son");
}
}
class Test{
public static void main(String args[]){
Son mySon=new Son(); //调用子类的变量和子类的方法
Father myFather=new Father(); //调用父类的变量和方法的方法
Father myFather2=mySon; //调用父类的变量和子类的方法
//mySon
System.out.println(mySon.i);
mySon.printInfo();
System.out.println();
//myFather
System.out.println(myFather.i);
myFather.printInfo();
System.out.println();
//myFather2
System.out.println(myFather2.i);
myFather2.printInfo();
System.out.println();
}
}
首先都是访问本身类的东西(方法与属性)的.(父类定义就调用父类的,子类定义的话就调用子类的)
当一个父类定义的变量引用一个子类实例时,调用一个方法时,这个方法将会调用子类,因为方法被覆盖.
情况就特殊在父类定义变量,而引用子类对像的时候.
Father(父类) myFather = new Son(子类)();
所以输出为:
20
IN SON
10
IN FATHOR
10
IN SON
通过引用类型的变量来访问所引用对象的方法和属性的时候,jvm采用以下绑定规则。
实例方法与引用变量实际引用的对象的方法绑定,动态绑定,因为是在运行时由jvm动态决定的
静态方法,成员变量(静态和实例变量)与引用变量所声明的静态方法和成员变量绑定,这用绑定是在编译阶段做的绑定,是静态绑定。
分享到:
相关推荐
这种现象发生时,父类类型的引用被用来创建和操作子类的对象,允许我们利用子类扩展的功能,同时保持代码的通用性。下面将详细解释这一概念,并探讨其背后的机制、注意事项以及相关的访问权限问题。 首先,让我们...
如果一个类继承一个父类,那么子类会拥有父类所规定的所以成员 子类还可以拥有父类没有的独有成员 ...声明父类变量,实例化子类对象 Person p = new Student(); p.personshow();//说明不可以调用子类的方法,还是父类
在编程世界中,继承是面向对象编程的一个核心概念,它允许子类继承父类的特性并可以...以上就是关于“子类调用抽象父类”这一主题的主要内容,理解并熟练运用这些概念,可以帮助我们更好地设计和实现面向对象的程序。
但是,子类重写父类的方法需要遵守一定的规则,以避免编译器错误和运行时异常。 A. 重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别 Java 中,子类重写父类的方法时,需要注意访问级别的限制。子类...
当我们声明一个父类类型的引用并将其赋值为子类的对象时,如`Car car = new SportsCar();`,这里的`car`引用虽然只能访问到`Car`类中定义的成员,但实际存储在内存中的仍然是`SportsCar`的实例,包含了所有`Sports...
在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...
在这种情况下,子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。如果子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象...
例如,如果我们有一个Animal类作为父类,Cat和Dog作为子类,可以声明一个Animal类型的引用并将其指向Cat或Dog实例: ```java Animal animal = new Cat(); ``` 这样做的好处在于,我们可以使用Animal类的公共方法而...
这是面向对象编程中的一个基本规则,即子类实例化时会先执行父类的构造方法。如果父类还有父类,这个过程会一直向上递归,直到最顶层的类(Object类)。 2. **类成员变量初始化**:在所有父类构造器执行完毕后,...
在Python中,使用`class`关键字定义一个类,当我们声明一个类是另一个类的子类时,我们会使用冒号(:)后跟父类的名字,用逗号分隔多个父类。例如: ```python class ParentClass: pass class ChildClass...
例如,在上面的示例代码中,我们使用了父类`Animal`的引用来指向子类`Cat`、`Dog`和`Pig`的对象。 二、多态的前提 多态的前提是类与类之间的关系。要么继承,要么实现。继承是指子类继承父类的所有成员变量和成员...
1. **静态变量和静态初始化块**:首先,按照声明的顺序,执行父类的静态变量和静态初始化块,然后执行子类的静态变量和静态初始化块。这是因为静态成员属于类,不依赖于类的实例,所以在创建任何对象之前就已经完成...
子类可以使用 `super` 关键字来访问父类的成员变量和方法,但是这并不意味着子类创建了一个新的父类对象,而是只是访问父类的成员变量和方法。对象的内存布局是由对象所属的类确定的,每个 Java 对象在内存中都由...
这种关系模拟了现实世界中的遗传关系,使得子类可以重用和扩展父类的属性和方法。Java中的继承是单继承的,也就是说一个子类只能有一个直接父类。如果要声明一个类B继承类A,需要满足以下条件: 1. 类A非final。 2....
为了获取父类的所有属性,我们需要使用`Class`对象的`getDeclaredFields()`和`getFields()`方法,这两个方法分别返回类声明的所有字段(包括私有字段)和所有公有字段。但是,这些方法只能获取当前类的字段,不能...
封装是指将数据和方法封装在一起,继承是指子类继承父类的属性和方法,多态是指对象的行为可以根据不同的情况而改变。 6. 方法的形参:方法的形参可以是基本变量类型或对象类型,可以没有形参,也可以有多个形参。 ...
- **实例变量**:上转型对象只能访问父类中声明的实例变量,而不能访问子类特有的实例变量。 #### 3. 上转型对象的动态绑定 在Java中,方法调用是动态绑定的,即在编译时只知道方法的签名,而在运行时才确定实际...
当调用者使用父类引用调用子类对象的方法时,根据父类的异常声明,调用者可以捕获到所有可能的异常类型,包括子类可能抛出的更具体异常。如果子类能抛出更宽泛的异常,那么调用者可能无法正确处理所有可能出现的异常...
标题和描述提到了"多继承"以及"子类对象可以转换成父类对象",这涉及到类层次结构中的类型转换和向上转型。 首先,让我们了解什么是多继承。在C++中,一个类可以继承自一个或多个基类(父类)。这种继承方式允许...