Java基础之抽象类

1.抽象类概述

在Java中,一个没有方法体的方法应该定义为抽象方法。而类中如果存在抽象方法,该类必须定义为抽象类

2.抽象类的特点

抽象类和抽象方法必须使用abstract关键字修饰。

  • public abstract class 类名{}
  • public abstract void eat();

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。

抽象类不能实例化,即不能用来创建对象

  • 参照多态的方式,通过子类对象实例化,这叫抽象类多态。

抽象类的子类

  • 要么重写抽象类中的所有抽象方法(子类完成父类伟业)。
  • 要么定义为抽象类(子类不能完成父类伟业,交给后代完成)。

Animal.java

package com.ydh_01;
/*
    抽象类
* */
public abstract class Animal {
    /*
    public void eat(){
        System.out.println("吃东西");
    }
     */
    //抽象方法
    public abstract void eat();

    public void sleep(){
        System.out.println("睡觉");
    }
}

Cat.java

package com.ydh_01;

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

Dog.java

package com.ydh_01;

public abstract class Dog extends Animal{
}

AnimalDemo.java

package com.ydh_01;

public class AnimalDemo {
    public static void main(String[] args) {
//        Animal a = new Animal();
        Animal a=new Cat();
        a.eat();//猫吃鱼
        a.sleep();//睡觉
    }
}

3.抽象类的成员特点

成员变量

  • 可以是变量,也可以是常量

构造方法

  • 有构造方法,但是不能实例化。
  • 只能参照多态的方式,通过子类对象实例化,访问父类数据的初始化。

成员方法

  • 可以有抽象方法:子类必须实现,否则子类自身定义为抽象类。
  • 也可以有非抽象方法:提高代码的复用性。

Animal.java

package com.ydh_02;

public abstract class Animal {
    private int age=20;//变量
    private final String city="北京";//常量

    //有构造方法,但是不能实例化。即Animal a=new Animal();会报错
    public Animal(){

    }
    public Animal(int age){
        this.age=age;
    }

    //非抽象方法
    public void show(){
        age=40;
        System.out.println("age="+age);
//        city="上海";
        System.out.println("city="+city);
    }

    //抽象方法
    public abstract void eat();
}

Cat.java

package com.ydh_02;

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

AnimalDemo.java

package com.ydh_02;

public class AnimalDemo {
    public static void main(String[] args) {
        Animal a=new Cat();
        a.show();
        a.eat();
    }
}

4.案例:猫和狗(抽象类版)

Animal.java

package com.ydh_03;

public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}

Cat.java

package com.ydh_03;

public class Cat extends Animal{
    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

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

Dog.java

package com.ydh_03;

public class Dog extends Animal{
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}

AnimalDemo.java

package com.ydh_03;

public class AnimalDemo {
    public static void main(String[] args) {

        Animal a=new Cat();
        a.setName("加菲");
        a.setAge(5);
        System.out.println(a.getName()+","+a.getAge());
        a.eat();

        System.out.println("--------");
        a=new Cat("加菲",5);
        System.out.println(a.getName()+","+a.getAge());
        a.eat();

        System.out.println("--------");
        Animal a2=new Dog();
        a2.setName("小七");
        a2.setAge(3);
        System.out.println(a2.getName()+","+a2.getAge());
        a2.eat();

        System.out.println("--------");
        a2=new Dog("小七",3);
        System.out.println(a2.getName()+","+a2.getAge());
        a2.eat();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值