package scjp;
class Base
{
int i = 99;
public void amethod()
{
System.out.println("Base.amethod()");
}
Base()
{
amethod();
}
}
public class Demo66 extends Base
{
int i = -1;
public static void main(String argv[])
{
Demo66 b = new Demo66();
System.out.println(b.i);
b.amethod();
}
public void amethod()
{
System.out.println("Derived.amethod()");
}
}
执行结果是:
Derived.amethod() //这行之所以不是 Base.amethod()原因是因为子类覆盖了amethod这个方法的原因.
-1
Derived.amethod()
但是当把
Demo66 b = new Demo66();
改成
Base b = new Demo66();
时执行结果却是:
Derived.amethod()
99
Derived.amethod()
这是为什么呢,不管怎样b不都是指向new Demo66();的对象引用吗?为什么会变值呢?
分享到:
相关推荐
3. **变量隐藏**:如果子类和父类有同名的实例变量,子类变量会“隐藏”父类变量。通过父类引用访问这些变量时,实际访问的是父类的变量,而非子类的。 4. **类型转换**:虽然父类引用可以指向子类对象,但反过来...
子类的构造函数可以接受一个父类对象作为参数,然后在构造函数内部,使用成员变量直接赋值或者通过 `base` 关键字调用父类的构造函数。例如: ```csharp public class Parent { public int Id { get; set; } ...
子类对象可以赋值给父类类型的引用,但此时该对象实际上仍然是一个子类实例,只是从编译角度看作父类类型。这种特性称为“多态”。 示例代码如下: ```java public class SuperClass { protected String ...
在第二种情况下,我们使用 `Father` 对象赋值给 `Son` 变量,但是失败了。这是因为 `Father` 对象实际上是 `Father` 对象的实例,而不是 `Son` 对象的实例。 因此,我们可以总结出以下结论: * 子类对象可以当作...
在Java中,实例变量的初始化可以在声明时直接赋值,也可以在构造器中进行。无论哪种方式,父类的实例变量会在子类的实例变量之前初始化。这是因为子类实例变量是在父类实例变量的基础上增加的,因此需要先初始化父类...
由于 Java 语言的多态性使得可以用一个子类的实例赋值给一个父类的变量,而在一些情况下需要判断变量到底是一个什么类型的对象。 在 Java 中,数组也可以是同类收集(homogenous collections)或异类收集...
向上造型是把一个类的子类引用赋值给父类变量,向下造型是把父类对象赋值给予子类对象。 抽象类是使用 abstract 关键字对类进行修饰的,抽象类只有方法头的定义,没有方法体。抽象类不能被实例化,定义抽象类的目的...
protected成员变量在同一个包或子类中可访问;无修饰符的成员变量(包访问权限)只在同包内可访问。 3. **静态与非静态**: 静态成员变量属于类,而非实例。这意味着所有类的实例共享同一份静态变量。非静态成员变量...
如果子类定义了和父类同名的成员变量或方法,那么子类将会隐藏或重写父类的成员变量或方法。隐藏是指子类的成员变量遮蔽了父类的同名成员变量;重写是指子类提供了与父类同名、同参数列表的方法,实现了方法的定制。...
在创建子类实例时,会首先调用父类的构造方法。 ### final修饰符和abstract修饰符 - **final修饰符**:当类、方法或变量被`final`修饰时,意味着它们不能被继承、重写或修改。`final`类不能被继承,`final`方法不...
// 子类实例成员变量 public String s_Field = "子类实例"; // 子类静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类静态初始化"); } // 子类实例初始化块 { System...
我们可以在不损失任何功能的情况下,将`DerivedClass`的实例赋值给`BaseClass`类型的变量: ```csharp DerivedClass derivedInstance = new DerivedClass(); BaseClass baseReference = derivedInstance; // 向上...
对象的上转型对象(Upcasting)是指将子类对象赋值给父类类型的引用,这是Java中多态性的体现。这样做的好处是可以使用父类引用处理各种子类对象,而无需知道具体的子类类型。 `abstract`类是不能实例化的,它通常...
11. **子类与父类的关系**:子类对象可以直接赋值给父类对象,因为子类是父类的实例,反之则不行。子类对象可以调用父类的非私有成员,包括被覆盖的方法和被隐藏的属性,使用`super`关键字作为前缀。 12. **类的...
- 创建子类实例时,首先会执行父类的构造器,然后才是子类的构造器。 - `super`关键字用于调用父类的构造器,而`this`关键字用于调用当前类中的其他构造器。 - `super`和`this`必须出现在构造器的第一行,并且每次...
这种特性实现了代码的复用,并且通过子类对象赋值给父类变量,体现了多态性,即同一父类引用可以指向不同子类的实例。 在面向对象编程中,类(Class)和对象(Object,也称为实例,Instance)是两个关键概念。类...
在C++编程语言中,类(Class)是创建对象的基础,它定义了一组相关的属性(成员变量)和行为(成员函数)。本教程将深入探讨C类的成员变量和成员函数,帮助你更好地理解和掌握面向对象编程的核心概念。 一、成员...
向上转型是将子类对象赋值给父类引用的过程,是一种自动类型转换,此时可以调用父类中的方法,如果方法在子类中被重写了,那么会调用子类中的实现,这种机制被称为动态绑定。多态的实现减少了代码的冗余,提高了程序...
* 继承的概念:子类继承父类的成员变量和方法,子类可以使用父类的成员变量和方法。 * 继承的规则:子类和父类在同一个包中,子类可以继承父类的非私有成员变量和方法;子类和父类不在同一个包中,子类可以继承父类...
当子类中有与父类同名的方法或变量时,子类的成员会隐藏(遮盖)父类的成员。如果子类需要调用父类的同名成员,可以使用`super`关键字。例如,子类中定义了一个新的`name`变量,父类的`name`变量会被隐藏,通过`...