java继承杂谈

declarations  n.

声明 extends  v.

继承  

继承中注意的问题:

1  重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;重写方法不能使用比被重写方法更严格的访问权限。 重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。 

2  关键字super:在Java类中使用super来引用父类的成分    

super可用于访问父类中定义的属性    

super可用于调用父类中定义的成员方法    

super可用于在子类构造方法中调用父类的构造方法    

super的追溯不仅于直接父类,就是father的father。。。。。。

Super关键字有两个特殊的用途:    

  在子类构造函数中调用父类的构造函数    

    在子类中调用父类的方法。 

3  多态:多态就是重写和重载!而上塑造型或虚方法的调用更好的体现了多态。上溯造型(也叫虚方法)中,方法是调用子类自己的,属性是调用父类的。(一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法)

public class Father { 

        public String name = "王惠"; 

        public void bidBoy(){        

     System.out.println("今天我要是不打你,我就不是你娘!!!");        

   }

public class Son1 extends Father{ 

     public String name1 = "王鹏的姐姐";

     public String name = "张三三";

     public void bidBoy(){   //重写 

         System.out.println("我做错了什么?为什么你要打我!!!");

         System.out.println(super.name); 

         System.out.println(name);//如果子类没有name,那么这个name就输出父类的。

     }

public class Test{ 

    public static void main(String args[]){

    Father f = new Son1(); //上溯造型,虚方法调用

    f.bidBoy();//这里调用的是子类中重写父类的方法!上溯造型中,方法是调用子类自己的,属性是调用父类的。               System.out.println(f.name); 

    }

}

输出结果:

我做错了什么?为什么你要打我!!!    

王惠    

张三三    

王惠

 同类收集( homogenous collections) 

     MyDate[] m = new MyDate[2];

     m[0] = new MyDate(22, 12, 1964);

     m[1] = new MyDate(22, 7, 1964);

     异类收集(heterogeneous collections)

     Person [] p= new Person[3];

     p[0] = new Student();//跟person有继承关系

     p[1] = new Person();

     p[2] = new Graduate();//跟person有继承关系  方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法 public class Test{

      public void method(Person e) {

                //…… 

               e.getInfo();

     } 

    public static  void main(String args[]){

                 Test t = new Test();

                 Student m = new Student();

                 t.method(m);

     }

4 instanceof 操作符:

instanceof操作符的作用是判断一个变量是否是右操作数指出的类的一个对象,由于java语言的多态性使得可以用一个子类的实例赋值给一个父类的变量,而在一些情况下需要判断变量到底是一个什么类型的对象,这时就可以使用instanceof了。当左操作数是 右操作数指出的类的实例或者是子类的实例时都返回真,如果是将一个子类的实例赋值给一个父类的变量,用instanceof判断该变量是否是子类的一个实例时也将返回真。

5 对象造型:

对Java对象的强制类型转换称为造型在造型前可以使用instanceof操作符测试一个对象的类型从子类到父类的类型转换可以自动进行从父类到子类的类型转换必须通过造型(强制类型转换)实现无继承关系的引用类型间的转换是非法的

public class Test{ 

          public void method(Person e) { 

            System.out.println(e.getschool());

       //非法,因为从子类到父类的类型转换可以自动进行,故这里已经是父类了。父类的对象只能调用父类中有的方法。          

     if(e intstanceof Student){

                   Student me = (Student)e; 

                   System.out.println(me.getschool());

           }

 }       

public static  void main(Stirng args[]){

                 Test t = new Test();

                 Student m = new Student();

                 t.method(m);

         }

综合例子:

public class Animal {

     public String name;

     public void run()     { 

        System.out.println("交通基本靠跑");

     }    

  public void say()     {

         System.out.println("通讯基本靠叫");

     }

public class Cat extends Animal{ 

    /*      * 如果存在继承关系的话,子类会默认的调用父类的默认构造器,而如果重载父类的构造器,  * 子类需要调用重载之后的构造器,且父类的构造器必须在子类的最开始最前端进行调用。      *       */

  public Cat()     { 

         super();

  }        

  public void worke()     { 

         System.out.println("猫挠沙发...咔咔..."); 

  }

     public void say()     {

         System.out.println("喵喵...");

     }

 

public class Dog extends Animal{

     public void worke()     { 

        System.out.println("狗看门儿!!");

     }

     public void say()     {

         System.out.println("汪汪汪...");

     }

public class AnimalFactory {

     public static void method(Animal[] animal)     { 

        //循环,遍历出Animal数组当中所有的对象并调用Cat\Dog当中的worke\say方法及Animal当中的run/say方法。           for(Animal a:animal)   {

                   if(a instanceof Dog)   {

                       Dog d = (Dog)a;

                       d.worke();

                       d.say(); 

                       continue;

             }

             if(a instanceof Cat) {

                     Cat c = (Cat)a;

                     c.worke();

                     c.say();

                     continue;

              }

              if(a instanceof Animal)

               {

                     continue;//这个continue可以省掉

                      }

         }

     }

public class TestAnimal {

     public static void main(String[] args){

             Animal[] a = new Animal[3];         //异类收集

             a[0] = new Dog();

             a[1] = new Cat();

             a[2] = new Animal();

             ((Cat)a[1]).worke();//强制类型转换,因为worke()这个不是子类重写父类的方法,所以必须强制类型转换~                       a[1].say();//这句不需要强制类型转换,因为say()是子类重写父类的方法。                                         AnimalFactory.method(a);//method方法是静态的,可以直接调用,当然写上面那条语句也没有错。

         }

}

输出结果:        

猫挠沙发...咔咔...    

喵喵...    

狗看门儿!!    

汪汪汪...    

猫挠沙发...咔咔...    

喵喵... 

6 方法重载:

在同一个类中可以定义多个同名方法。重载方法的参数列表必须不同,也就是参数个数或参数类型不同!重载方法的返回值类型可以相同,也可以不同 构造方法重载:     构造方法重载,参数列表必须不同,也就是参数个数或参数类型不同!可以在构造方法的第一行使用this关键字调用本类的其它(重载的)构造方法

import java.util.Date;

public class Person {

  private String name;

  private int age;            

  private Date birthDate;//Date类型引入util包

            public Person(String name, int age, Date d) {

          this.name = name;

          this.age = age;

          this.birthDate = d;

            }

           public Person(String name, int age) {

          this(name, age, null); 

           }

           public Person(String name, Date d) {

          this(name, 30, d);

           }

           public Person(String name) {

          this(name, 30);

           }

构造方法不能继承:

子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法 调用父类构造方法:子类的构造方法必须调用父类的构造方法!如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法,如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错在子类的构造方法中可使用语句super(argument_list) 调用父类的构造方法 对象构造和初始化细节:分配存储空间并进行默认的初始化按下述步骤初始化实例变量,绑定构造方法参数,如有this()调用,则调用相应的重载构造方法,然后跳转到步骤5。显式或隐式追溯调用父类的构造方法(Object类除外)进行实例变量的显式初始化操作   

执行当前构造方法的方法体中其余的语句 Object 类:Object类是所有Java类的根父类

posted @ 2012-09-28 10:47  _Felix  阅读(114)  评论(0)    收藏  举报