继承也是一个神奇的东西!!!
1、实例化一个对象时,类的执行顺序是怎么样的???
若是有父类,则按照下面的顺序先执行父类,再执行本身(父类也要遵循这个规则)
1、初始化成员变量
2、执行代码块
3、执行构造函数
代码块执行规则:
代码块有两种,一种是声明为static的代码块,另一种就是普通的代码块
1、若是static代码块,则只在首次实例化对象时执行一次,并且早于普通的代码块执行,且只能访问static成员变量
2、若是普通的代码块,则每次实例化一个对象时都会执行
3、对于同一种类的代码块,按照声明的顺序从前到后依次执行
2、创建子类对象时是否会产生父类对象???
不会产生父类对象。首先如果父类是抽象类,抽象类是不能实例化的,这是一个证明;只有new语句才能分配内存产生对象,构造函数只是起初始化作用的,所以不会产生父类对象
3、类A是怎么继承类B的???(注:以下均为非私有的方法或变量,私有的方法或变量无法被继承)
1、类A继承类B的非静态成员变量或方法(以下x指非静态成员变量或方法)
若类A中不含有与类B相同的x,则x指类A继承的x,把x当成自己的使用就可以了
若类A中含有与类B相同的x,则类A中的x将覆盖类B中的x,意思是:x指的是类A本身含有的x,而不是继承的x,注意是"覆盖",也就是类A中仍含有类B中的x,也就表示类A中有两个x,只不过不能直接通过"对象.x"这种方式访问类A继承的x,因为这种方式是访问自己的x,但可以通过super.x访问继承的x
2、类A继承类B的静态成员变量(以下x指静态成员变量)
若类A中不含有与类B相同的x,则类A和类B将共同使用x,在类A中修改x,类B中的x也会被修改;在类B中修改x,类A中的x也会被修改;其实此时类A和类B的x就是同一个x
若类A中含有与类B相同的x,则类A中的x将覆盖类B中的x,也就是类A有两个x,一个自己的、另一个是继承的,继承的x通过super.x访问,在类A中修改super.x,类B中的x也会被修改,在类B中修改x,类A中的super.x也将被修改
类A如何调用函数的???
1、每次先看自己有没有这个函数,若有,就使用自己的函数
仔细理解一下下面的代码:
class B
{
void f()
{
System.out.println("This is the f function in class B");
f();//调用f()函数
}
}
public class A extends B
{
A()
{
super();
}
void ff()
{
System.out.println("This is the ff function in class A");//调用父类的f()函数
super.f();
}
void f()
{
System.out.println("This is the f function in class A");
}
public static void main(String []args)
{
A p=new A();
p.ff();
}
}
这个代码是可以正常运行的,运行结果是:
你可能会问:B中的f()函数不是无限递归吗???
仔细体会上面继承的过程。。。。。。