java 继承和多态 问题

来源:互联网 发布:软件 地图周围距离 编辑:程序博客网 时间:2024/06/04 21:12

第一类:调用父类构造函数
 1.如果子类自己没有定义任何构造函数,那么在创建子类对象的时候将调用父类无参数的构造函数。
 2.如果子类定义了自己的构造函数,则在创建子类对象的时候,系统首先隐含调用父类无参数的构造函数,然后再执行自己的构造函数。
 3.如果子类定义了自己的构造函数,并且显示的使用super关键字显示的调用了父类的构造函数,系统将不再隐含调用父类构造函数(直接调用)。

class Super{
 int i=10;
 Super(){
  print();
  i=20;
 }
 void print(){
  System.out.print(i);
 }
}
public class Child extends Super{
 int j=30;
 Child(){
  super();
  print();
  j=40;
 }
 void print(){
  System.out.print(j);
 }
 public static void main(String[] args){
 System.out.print(new Child().j);
 }
}

第二类:方法的重写
 先了解写重写:子类在重写父类方法时,应保持与父类完全相同的方法头声明,即与父类应该有完全相同的方法名,返回值,和参数列表。
 子类通过才重写,使父类方法在子类对象中不复存在的。
class Base
{
void test() {
System.out.println("Base.test()");
}
}
public class Child extends Base {
void test() {
System.out.println("Child.test()");
}
static public void main(String[] a) {
Child anObj = new Child();
Base baseObj = (Base)anObj;//相当于Base baseObj = new Child()所以baseObj 任然是子类对象。
baseObj.test();
}
}
第三类:含有静态块的继承
 静态块在类加载的时候就开始执行,并且仅在第一次加载的时候执行。
class A{
static{
System.out.print("a");
}
public A (){
System.out.print("x");
}
}
class B extends A{
static{
System.out.print("b");
}
public B (){
System.out.print("y");
}
}
public class Test{
public static void main(String[] args){
A ab = new B ();//先加载A,执行static块,再加载B,执行static块,然后new B(),由于B有自己的构造函数,所以先隐含调用A的无参构造函数,输出x,然后调用B自己的构造函数,输出y
ab = new B ();//由于是一个程序,A和B都已加载完成,也就不再调用static块了,然后接着执行构造函数即可。
}
}

原创粉丝点击