下面这段代码:
public class Qdb extends Depend
{
int i = 30;
public Qdb()
{
print();
super.print();
i = 40;
}
void print()
{
System.out.println("Target=> " + i);
}
public static void main(String[] args)
{
new Qdb();
}
}
class Depend
{
int i = 10;
public Depend()
{
print();
i = 20;
}
void print()
{
System.out.println("Depend=> " + i);
}
}
我的预期结果:
Depend=> 10
Target=>30
Depend=>20
而最终结果是:
Target=> 0
Target=> 30
Depend=> 20
这里面涉及到的Java知识点有:
1, 方法的覆盖.
2, 属性在整个类初始化时的赋值时机.
3, 子类初始化时先执行父类的构造方法.
4, 当子类里有父类里同名的属性时,怎么处理?
所得到的是:子类在初始化时在先执行父类的的构造方法这不假,但当在父类的构造方法里要调用有覆盖嫌疑的方法时(也就是本例中的print方法)要调用子类里的方法.
....
后来多想想后,觉得出现"Target=> 0"很正常的: 毕竟现在是要初始一个子类的实例,JVM在背后要先调用父类里的构造方法,但这是为子类做前期准备的,在这个构造方法里要调用的方法也应该是子类自身的--也就是子类的print方法.
但上面这是演义型的解释,没有官方的正式解释.为以后的正式研究做前期的感性积累.
分享到:
相关推荐
如果类中没有定义构造器,Java会提供一个默认的无参构造器。 八、this与super关键字 1. this:当前对象的引用,常用于区分成员变量和局部变量,以及调用当前类的其他构造器。 2. super:父类对象的引用,用于调用...
6. 构造器:构造器是用于初始化新创建对象的特殊方法,其名称与类名相同,没有返回类型。在创建对象时,构造器会自动调用,用于设置对象的初始状态。 7. 接口:接口在Java中是一种完全抽象的类型,只包含常量和抽象...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一次编写,到处...通过学习这套资料,你将能够更好地掌握Java编程的核心技巧,为日后的项目开发打下坚实基础。
8. **STL(标准模板库)**:C++的STL包含了一系列容器(如vector、list、map等)、迭代器、算法和内存管理工具,极大地提高了代码的效率和可读性。 9. **I/O流**:C++的iostream库提供了输入/输出流的概念,使得从...
Java程序设计与开发是计算机科学领域的一个重要主题,尤其对于初学者和有志于成为专业软件开发者的人来...通过张晓龙老师的电子教案,Java爱好者可以系统地学习Java编程,掌握核心概念,为日后的软件开发打下坚实基础。
理解类的概念,掌握构造函数、析构函数、成员函数、友元等特性,是C++学习的重点。配套程序中应包含简单的类设计,以帮助学习者理解面向对象编程。 4. **继承与多态**:在C++中,继承允许创建一个新类,它扩展了...
STL是C++的重要组成部分,包含了容器(如vector、list、map等)、算法(如排序、查找等)、迭代器和函数对象(如比较函数、转换函数等),极大地提高了开发效率。 五、异常处理 C++中的异常处理允许程序在运行时...
每个类都可有一个或多个构造器,它们的名称与类名相同,无返回类型。 2. **访问修饰符**:如`public`、`private`、`protected`,用于控制类、字段和方法的可见性。 3. **接口**:Java中的接口定义了一组抽象方法,...
Java的反射机制允许在运行时动态地获取类的信息并操作类的成员,如字段、方法和构造器。这在Spring框架等中广泛应用,可以实现动态实例化类、设置属性和调用方法等功能。 获取日期和时间可以使用`Calendar`类,例如...
8. **STL(标准模板库)**:STL是一组预先编写好的模板类和函数,包含容器(如vector、list)、迭代器、算法(如排序、查找)和函数对象,极大地提高了编程效率。 9. **内存管理**:理解栈内存和堆内存的区别,以及...