动手动脑4 构造与多态

构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
  构造函数是初始化已创建好的对象中成员变量的,而不是创建对象的,构造函数只是进一步为已创建的对象属性赋值对,使之更新“想象”中的对象,对象在非静态代码块执行之前,在构造方法调用之前已经存在了。子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!

  构造函数的特点:无论是用户自定义的构造函数还是默认构造函数都主要有以下特点:
  1. 在对象被创建时自动执行;
  2. 构造函数的函数名与类名相同;
  3. 没有返回值类型、也没有返回值;
  4. 构造函数不能被显式调用。

在函数的继承里,子类必须调用父类的构造函数。但是,子类只能继承父类的默认构造函数,如果父类没有默认的构造函数,那子类不能从父类继承默认构造函数.这时子类必须使用super来实现对父类的非默认构造函数的调用.在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。

public class TestPolymorphism

{

 

 

    public static void main(String args[])

    {

 

        Parent p=new Parent();

 

        p.Introduce();

 

        System.out.println(p.value);

 

        p=new Son();

 

        p.Introduce();

 

        System.out.println(p.value);

 

        p=new Daughter();

 

        p.Introduce();

 

        System.out.println(p.value);

 

 

    }

  

 

 

多态代码:当多个类实现同一接口(或派生自同一抽象类)时,针对这些类所创建的对象调用接口所定义的方法时,会分别调用相应的类的具体实现代码

 

 

 

 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();

        

    }

}

 

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 TestPolymorphism
{
 
 
    public static void main(String args[])
    {
 
        Parent p=new Parent();
 
        p.Introduce();
 
        System.out.println(p.value);
 
        p=new Son();
 
        p.Introduce();
 
        System.out.println(p.value);
 
        p=new Daughter();
 
        p.Introduce();
 
        System.out.println(p.value);
 
 
    }

  

多态代码:当多个类实现同一接口(或派生自同一抽象类)时,针对这些类所创建的对象调用接口所定义的方法时,会分别调用相应的类的具体实现代码

posted @ 2018-11-04 21:29  阡墨  阅读(122)  评论(0)    收藏  举报