课后作业4

1.继承条件下的构造方法调用

class Grandparent 
{


    public Grandparent()
     {

            System.out.println("GrandParent Created.");
    
}


    public Grandparent(String string) 
    {

            System.out.println("GrandParent Created.String:" + string);
    
 }

}



class Parent extends Grandparent
{


    public Parent()
     {

            //super("Hello.Grandparent.");

            System.out.println("Parent Created");
    
       // super("Hello.Grandparent.");

      }

}



class Child extends Parent 
{


    public Child()
     {
    
        System.out.println("Child Created");

      }

}



public class TestInherits 
{


    public static void main(String args[])
     {

            Child c = new Child();
    
  }

}

运行结果:

先调用父类的构造函数,后调用子类的构造函数,因为子类继承的父类所以,调用子类的构造函数时父类已经存在,所以时先调用父类的构造函数初始化父类,后调用子类的构造函数。

class Grandparent 
{


    public Grandparent()
     {

            System.out.println("GrandParent Created.");
    
}


    public Grandparent(String string) 
    {

            System.out.println("GrandParent Created.String:" + string);
    
 }

}



class Parent extends Grandparent
{


    public Parent()
     {

            super("Hello.Grandparent.");

            System.out.println("Parent Created");
    
    //   super("Hello.Grandparent.");

      }

}



class Child extends Parent 
{


    public Child()
     {
    
        System.out.println("Child Created");

      }

}



public class TestInherits 
{


    public static void main(String args[])
     {

            Child c = new Child();
    
  }

}

运行结果:

用super调用父类构造函数,而且super必须是子类的第一行代码。

思考:构造函数用于初始化,如果基类没有初始化是无法进行任何操作的,所以必须在第一行代码就进行初始化。

2.“方法覆盖(override)”的要点

class Fuigai {
public void coutFuigai() {
    System.out.println("fulei");
}
}
class Son extends Fuigai{
    public void coutFuigai() {
        super.coutFuigai();
        System.out.println("zilei");
    }
}
public  class Test {
    public static void main(String[] args) {
    Fuigai a=new Fuigai();
    Son b=new Son();
    b.coutFuigai();
    a.coutFuigai();
    }
}

运行结果:

同名时Java会覆盖前一个方法的内容。

3.动手动脑3

class Parent{
    public int myValue=100;
    public void printValue() {
    System.out.println("Parent.printValue(),myValue="+myValue);
    }
}
class Child extends Parent{
    public int myValue=200;
    public void printValue() {
        System.out.println("Child.printValue(),myValue="+myValue);
    }
}
public class ParentChildTest {
public static void main(String[] args) {
    Parent parent=new Parent();
    parent.printValue();
    Child child=new Child();
    child.printValue();
    
    parent=child;
    parent.printValue();
    
    parent.myValue++;
    parent.printValue();
    
    ((Child)parent).myValue++;
    parent.printValue();
}
}

运行结果

 第一条输出父类的myValue;

第二条输出子类的myValue;

第三条子类的对象child赋给parent,最后调用对象parent相当调用child;

第四条修改parent的myValue,但对象child已经赋给了parent,所以最后调用对象parent输出的还是child的myValue的值;

第五条修改child的myValue,并最终同第四条一样,输出child的myValue的值。

猜你喜欢

转载自www.cnblogs.com/my---world/p/9890536.html