疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java入门之面向对象(抽象类到底多抽象)


 

   

  [java]

  /*

  抽象类的概述:

  动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。

  我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须被称为是抽象类。

  抽象类的特点:

  A:抽象类和抽象方法必须用abstract关键字修饰

  B:抽象类中(不一定)有抽象方法,可以有具体的。但是有抽象方法的类必须定义为抽象类

  C:抽象类不能实例化//Animal a = new Animal();无法实例化就是指:这个语句是没法执行的,抽象的不是具体无法创建该抽象类对象

  因为它不是具体的。

  抽象类有构造方法,但是不能实例化?构造方法的作用是什么?

  用于子类访问该抽象父类数据时候的初始化

  D:抽象的子类

  a:如果不想重写抽象方法,该子类是一个抽象类。但这样没什么意义

  b:重写所有的抽象方法,这个时候子类是一个具体的类。

  抽象类的实例化其实是靠具体的子类实现的。是多态的方式。

  Animal a = new Cat();

  */

  //abstract class Animal //抽象类的声明格式

  abstract class Animal {

  //抽象方法

  //public abstract void eat(){} //空方法体,错误的

  public abstract void eat();//抽象没有方法体

  public Animal(){}

  }

  //子类是抽象类,没有意义

  abstract class Dog extends Animal {}

  //子类是具体类,重写抽象方法

  class Cat extends Animal {

  public void eat() {//对父类eat抽象方法的重写

  System.out.println("猫吃鱼");

  }

  }

  class AbstractDemo {

  public static void main(String[] args) {

  //创建对象

  //Animal是抽象的; 无法实例化

  //Animal a = new Animal();

  //通过((多态)的方式实例化)

  Animal a = new Cat();

  a.eat();

  }

  }

  [java] view plain copy

  /*

  抽象类的成员特点:

  成员变量:既可以是变量,也可以是常量。

  构造方法:有。

  作用:用于子类访问父类数据的初始化。

  成员方法:既可以是抽象的,也可以是非抽象的。

  抽象类的成员方法特性:

  A:抽象方法 强制要求子类做的事情。

  B:非抽象方法 子类继承的事情,提高代码复用性。

  */

  abstract class Animal {

  public int num = 10;//变量

  public final int num2 = 20;//常量

  public Animal() {}

  public Animal(String name,int age){}

  public abstract void show();

  public void method() {

  System.out.println("method");

  }

  }

  class Dog extends Animal {

  public void show() {

  System.out.println("show Dog");

  }

  }

  class AbstractDemo2 {

  public static void main(String[] args) {

  Animal a = new Dog();

  a.num = 100;

  System.out.println(a.num);

  //a.num2 = 200;//常亮不能再赋值了

  System.out.println(a.num2);

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

  a.show();

  a.method();//继承的方法

  }

  }

  [java] view plain copy

  /*

  一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

  A:可以。

  B:不让创建对象。只能通过子类去访问,通过自定义继承或者多态的方式

  abstract不能和哪些关键字共存?

  private 冲突

  final 冲突

  static 无意义

  */