23 抽象类 abstract



/*概念
  * abstract:关键字,用于修饰方法和类
  * 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
  * 抽象类:有抽象方法的类必须是抽象类
*
* 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
*/

* 抽象类的特点:
  *抽象方法只能在抽象类里面

  * 抽象类和抽象方法必须被abstract修饰
  * 抽象类不能创建对象(不能实例化)
  * 抽象类中可以有非抽象的方法
  * 抽象类和类的关系也是继承
  * 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类

* 抽象类的成员特点:
* 成员变量
* 可以有成员变量
* 可以有常量
* 成员方法
* 可以有抽象方法
* 可以有非抽象方法
* 构造方法
* 可以有构造方法的,需要对抽象类的成员变量进行初始化
*
* final:修饰类、成员变量、成员方法

*/


public class AbstractDemo {
    public static void main(String[] args) {
        //抽象类不能创建对象(不能实例化)
//    Animal a = new Animal();
        Cat c = new Cat();
        c.eat();
    }
}

abstract class Animal { //方法使用抽象方法后,类需要改为抽象类
    //猫吃鱼,狗吃草。都有eat方法,但是吃的东西不一样,这时需要使用抽象方法
    abstract public void eat();

//    public void eat() {
//        System.out.println("吃。。。");
//    };
}

class Cat extends Animal {
    //继承了抽象类后方法和父类不同会报错,方法必须重新
//   public void eat(String name) {
//       System.out.println("猫吃鱼");
//   }

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

abstract class Dog  extends Animal{
    //要么重新方法,要么类需要改为抽象类
    public void eat(String name) {
        System.out.println("狗吃草");
    }
}

输出

package day2_抽象类;
/*
 * 抽象类的成员特点:
 *         成员变量
 *             可以有成员变量
 *             可以有常量
 *         成员方法
 *             可以有抽象方法
 *             可以有非抽象方法
 *         构造方法
 *             可以有构造方法的,需要对抽象类的成员变量进行初始化
 *
 * final:修饰类、成员变量、成员方法
 */
public class AbstractDmoe2 {
    public static void main(String[] args) {
        Dog2 d = new Dog2();
        d.brking();
        d.eat();
    }
}

abstract class Animal2 {
    String name = "哮天犬";
    final int num = 10; //final 修饰的变量是固定值,不可改变。
    public Animal2() { //抽象类可以有构造方法,因为需要对成员变量初始化。
        System.out.println("抽象类的无参构造");
    }
    public Animal2(String name) {
        System.out.println("抽象类有参构造");
    }
    public abstract void eat();
}

class Dog2 extends Animal2 {

    @Override
    public void eat() {
    }

    public void brking() {//
        System.out.println(name + "," + num);
    }
}

输出

思考:能否在brking方法第一行加super或this?

不能,super或this是在构造方法中调用的

原文地址:https://www.cnblogs.com/longesang/p/11217840.html