2017-09-20

 

什么是抽象类:

一个类中没有包含足够的信息来描绘一个具体的对象;用abstract修饰的类就是抽象类;抽象类中不一定有抽象方法;但是有抽象方法就一定存在于抽象类中;

抽象类只能用作父类,表示继承关系。继承抽象类的子类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。

定义抽象类:

【访问权限】abstract  class 类名 {成员列表}

抽象方法:

在类中没有方法体的方法,称之为抽象方法;

抽象方法的声明:

【访问权限】abstract 返回值类型 方法名称(参数列表);

作用:可扩展性好;可优化程序;

多态性:

体现在:方法重载;方法覆盖;多态参数;

①:编译期类型与运行期类型相同;

A  a = new A();     

a.show();

在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。

构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法

②:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型;

//A类是B类的父类                              

A  ab = new B();

ab.show();

对象ab的编译期类型为父类A类,运行期类型为子类B类。

如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系。

多态环境下对成员方法的调用:

编译在左,运行在右;

多态环境下对静态成员方法的调用:

编译在左,运行也在左;

多态环境下对成员变量的调用:

简单的说:编译和运行都看等号左边。

    注意:变量不存在被子类覆写这一说法,只有方法存在覆写。

 

父类:

public class Anmainal {

String name = "动物";

 

//方法

void eat(){

System.out.println("父类 : 吃饭");

}

Anmainal(){

System.out.println("父类 :构造方法");

}

static void jump() {

System.out.println("父类 :jump ");

}

}

子类1

public class Cat extends Anmainal  {

String name = "猫";

void eat() {

System.out.println("猫   子类 : 吃饭");

}

void drink(){

System.out.println("猫   子类 :喝水");

}

Cat(){

System.out.println("猫   子类 :构造方法");

}

static void jump() {

System.out.println("猫    子类 :jump ");

}

}

public class Main {

 

public static void main(String[] args) {

Anmainal  A=new Cat();

A.eat();    //结果:   子类 吃饭

System.out.println(A.name);    //结果:动物

A.jump();       //调用静态方法时,出现父类的结果

 

Cat  B = (Cat) A;  //需要强制转换,子类中创新的方法才能出现结果

B.drink();    

System.out.println(B.name); //需要强制转换,子类中属性才能出现结果 }

父类引用指向子类对象:

当编译器类型是父类,运行期类型是子类时,被称为父类引用指向子类对象;

class  Animal{        //父类

               ……

}

class Cat  extends Animal{

               ……    //子类Cat

}

class Dog extends Animal {

               ……    //子类Dog

}

Cat m = new Cat()

Animal x = new Cat()  //Animal 的引用指向Cat的对象

对象m可以调用猫类中的所有方法,x只能调用动物类中定义的方法,

猫类扩展的新方法不能调用。     (例子如上)

多态参数:

方法参数具有多态性:

父类:

public class Anmainal {

String name = "动物";

 

//方法

void eat(){

System.out.println("父类 : 吃饭");

}

Anmainal(){

System.out.println("父类 :构造方法");

}

static void jump() {

System.out.println("父类 :jump ");

}

}

子类猫:

public class Cat extends Anmainal  {

String name = "猫";

void eat() {

System.out.println("猫   子类 : 吃饭");

}

void drink(){

System.out.println("猫   子类 :喝水");

}

Cat(){

System.out.println("猫   子类 :构造方法");

}

static void jump() {

System.out.println("猫    子类 :jump ");

}

}

子类狗:

public class Dog extends Anmainal{

String name = "狗";

void eat() {

System.out.println("狗          子类 : 吃饭");

}

void drink(){

System.out.println("狗         子类 :喝水");

}

Dog(){

System.out.println("狗          子类 :构造方法");

}

static void jump() {

System.out.println("狗          子类 jump ");

}

}

public class Main {

public static void main(String[] args) {

Anmainal A1 = new Anmainal();

Cat B = new Cat();

Dog D = new Dog();

A1.eat();

B.eat();

D.eat();

}

 

void sing(Anmainal  A1) {        

A1.eat();

}

}

多态环境下对象造型:

向上造型 –又称自动类型提升:

class Animal{

     abstract void eat();

}

class Cat extends Animal{

      void look() {

System.out.println("看家");

 }

    }      

 ………

   Animal x=new Cat()  //向上造型,Cat对象提升到Animal对象

   x.eat()   //只能使用父类中的方法

   x.look()  //报错!不能使用子类中的方法

向上造型的作用是:提高程序的扩展性。

向下造型 –又称向下转型:

class Animal{

     abstract void eat();

}

class Cat extendsAnimal{

      void look() {

System.out.println("看家");

    }

    }      

 ………

Animal x=new Cat()

Cat  m=(Cat)x;  //向下转型

   m.eat() ;

   m.look();//子父类中的方法都可以使用

向下造型的作用是:为了使用子类中的特有方法。

 

posted @ 2017-09-21 09:04  rvic  阅读(127)  评论(0编辑  收藏  举报