JAVA中的抽象类

一、介绍

      Java中提供了两种类:具体类和抽象类。

1、abstract意思为“抽象的”,用abstract关键字来修饰一个类时,这个类就叫做抽象类。

语法:访问修饰符 abstract  类名{

}

public abstract class A{
}

2、用abstract关键字来修饰一个方法时,这个方法是抽象方法。

语法:访问修饰符 abstract 返回值类型  方法名(参数类表);

 public abstract void hello();

注意:抽象方法无方法体,只声明。

二、特点

1、抽象类不能实例化。

public class C {
    public static void main(String[] args) {
        System.out.println("hello!");
       // D d=new D() ;----->报错
    }
}
abstract class D{
    
}

2、一个类中含有抽象方法则这个类一定为抽象类。

3、抽象类中可以不含有抽象方法。

4、abstract只能修饰类和方法,不能修饰属性和其他的。

5、抽象类可以有任意成员(抽象类的本质还是类),比如:非抽象方法、构造器、静态属性、静态方法等。

public abstract class D{
    public int a =10;
    public String name="jack";
    public  D(){
        System.out.println("抽象类D的无参构造方法!");
    }
    public void hi(){
        System.out.println("Hello World!");
    }
    public static void ok(){
        System.out.println("ok!");
    }
    public abstract void hello();
}

6、抽象方法不能有主体,即不能实现。

7、如果一个类继承了抽象类,则它必须实现抽象类中所有的抽象方法,除非它自己也声明为abstract类

public abstract class E{
    public abstract void walk();
}
abstract class F extends E{
}
class G extends E{

    @Override
    public void walk() {
        
    }
}

8、抽象方法不能使用private、final和static来修饰,因为这些关键字都是与重写相违背的。

三、抽象类的作用

      当父类知道子类要完成某种行为,但每个子类的实现方式又不一样时,于是该父类就把行为定义为抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明为抽象类。

例如:

先声明一个Cat类,Cat需要有睡觉这一方法

public class Cat{
   public void sleep(){
         System.out.println("我正在睡觉!");
   }
}

再声明一个Dog类,Dog也需要睡觉这一方法

public class Dog{
   public void sleep(){
         System.out.println("我正在睡觉!");
   }
}

这里的Cat与Dog都有共同的行为,若存在一个父类Animal类同样有睡觉的方法,且父类与子类“睡觉”这一方法完全相同,则子类可以完全继承父类这一方法。

public class Aniaml{
   public void sleep(){
         System.out.println("我正在睡觉!");
   }
}
public class Cat extends Animal{
    @Override
    public void sleep() {
        super.sleep();
    }
}
public class Dog extends Animal{
    @Override
    public void sleep() {
        super.sleep();
    }
}

若在此时给Dog和Cat添加一个eat()的行为,不同的是,Dog吃的是骨头,Cat吃的是鱼,此时就可以将Dog和Cat作为子类,抽象出eat()这个行为作为抽象方法放在父类中

public abstract class Aniaml{
   public void sleep(){
         System.out.println("我正在睡觉!");
   }
   public abstract void eat();
}

子类Cat重写eat()方法

public class Cat extends Animal{
    @Override
    public void sleep() {
        super.sleep();
    }

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

子类Dog重写eat方法

public class Dog extends Animal{
    @Override
    public void sleep() {
        super.sleep();
    }

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

创建一个测试类:由于父类Animal是抽象类,无法实例化对象,只能通过对子类的实例化对象来调用方法。

public class AbstractTest {
    public static void main(String[] args) {
        System.out.println("狗的行为--------------------");
        Dog dog= new Dog();
        dog.sleep();
        dog.eat();
        System.out.println("猫的行为--------------------");
        Cat cat= new Cat();
        cat.sleep();
        cat.eat();
    }
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值