论坛首页 入门技术论坛

corejava辅导(4--2)

浏览 1076 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-03  

super关键字

 

super(),表示在子类构造方法中调用父类构造方法(可以通过这种方法在子类的构造方法中初始化父类中的属性),super()只能出现在构造方法的第一句上。super(),在子类的构造方中指明构造父类时调用哪一个父类的构造方法构造父类。

 

super,表示一个父类的对象,可以通过super来使用父类中可以访问方法(可以在父类中定义setXxx()getXxx()方法来访问父类中的私有属性),super可以屏蔽父子类中同名属性的命名冲突。

例:

public class Person{

     ……

     private int age;

     private String name;

     public Person(){

     }

     public Person(String name){

          this.name=name;

    }

     public void study(){

         System.out.println(“学习”);

     }

}

class Child extends Person{

     private int age;//属性的遮盖

     public Child(String name){

         spuer(name);//调用父类的构造方法初始化父类的属性

     }

public void study(){//覆盖了父类中的study()方法

         System.out.println(spuer.getName()+“在小学学习”);

        //super.getName()也就是调用了父类的访法

     }

}

 

注意:构造方法的第一句既不是this(),也不是super()时,会隐含的调用其父类的无参的构造方法,即隐含的有super(),在写类的时候,一定要写无参的构造方法。

 

少覆盖原则:既子类应当尽量少的覆盖父类方法,如果覆盖了父类的大多数方法,那就应当考虑是否应当有继承关系

 

java中的多态(以子类覆盖了父类的方法为前提)

 

多态,把子类对象主观的看作是其父类型的对象,那么父类型就可以是很多种类型。

 

多态编译时多态(方法的重载)

      运行时多态(多态)

 

编译时类型,也就是可以被看作的类型,主观认定。

运行时类型,也就是实际的对象实例的类型,客观不可改变(也是被看作类型的子类型)

 

在对象产生时,运行时类型就已经确定不会改变,编译时类型可以和运行时类型不同。

对象引用声明并赋值后,就确定了其运行时类型。

编译时类型对象引用背后所指向运行时类型可以是其类型或者是其子类型。

 

多态三特性

1,对象实例确定则不可改变(客观不可改变)

2,只能调用编译时类型所定义的方法。

3,运行时会根据运行时类型去调用相应类型中定义的方法。

 

多态的意义:在需要使用一类对象的共性时,可以用多来屏蔽掉其子类中的差异。

 

注意:类的属性是没有多态的,会根据编译时类型访问。

子类覆盖了父类的方法,把子类对象实例赋值给父类类型的对象因用时才会有多态。

要注意区分子类中的方法重载。

对于方法的重载,会使用编译时类型来进行相应的方法调用。

 

instanceof,是用于判断一个对象是否属于某个类型

 

public class Animal{

     ……

     public void eat(){

         System.out.println(“eat something”);

     }

     public static void main(String[] args){

         Animal a=new Dog();

         Animal b=new Cat();

         ifb instanceof Dog{

              Dog d=Dogb

         }

        /*

Animal是编译时类型,并且是实际类型的父类,所以

多态优两个前提,父子类关系,还有方法的覆盖

*/

a.eat();

b.eat();

     }

}

class Dog extends Animal{

     public void eat(){

         System.out.println(“eat bone”);

     }

}

class Cat extends Animal{

     public void eat(){

         System.out.println(“eat fish”);

     }

}

 

结果:

eat bone

eat fish

//这里之所以显示的是子类中方法结果,就是由于多态,根据其实际类型调用子类的方法

 

例:

 

两种代码复用

 

白箱复用,继承复用,父类中的可以被子类访问到的就可以被继承,会有些不需要的内容被继承,这种方式不太好。

 

黑箱复用,组合复用,把要复用代码的类的对象作为本类的属性,通过方法的委托来实现有选择的复用,方法的委托是在本类的方法内部通过该类的对象调用要使用的方法。

 

注意:尽量用组合复用替代继承复用。

 

例:

public class Car(){

     ……

}

 

class Benz{

     Car c=new Car();

     ……

}

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics