抽象类

  • 什么是抽象类:

    抽象类只不过是在普通类的基础上增加了抽象方法,并且这个类需要用abstract关键字来修饰。那么什么是抽象方法,抽象方法就是定义了一个方法但并不去实现它,即没有方法体,因为抽象类实现这个方法并没有什么意义,抽象方法要使用abstract关键字来修饰。

    比如说,我们定义一个Animal的抽象类,里面定义一个eat的抽象方法,我们都知道各种动物吃各种不同的食物,那么是让Animal类是实现吃竹子,还是吃鱼,对吧,所以是不是让Animal这个类实现eat方法就没有意义,让其子类重写父类的eat方法就好了。

    我们来看一个例子:

abstract class Animal{
    private String name;
    //普通方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    //抽象方法,没有方法体,{}中的为方法体
    public abstract void eat();
}
class Cat extends Animal {
    //子类重写eat方法
    @Override
    public void eat() {
        System.out.println("我喜欢吃小鱼干!");
    }
}
class Dog extends Animal {
    //子类重写eat方法
    @Override
    public void eat() {
        System.out.println("我喜欢啃骨头!");
    }
}
public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();
    }
}

我们可以发现,抽象类就只是比普通类多了抽象方法。

  • 现在看看要想使用抽象类,应该注意写什么:
  1. 抽象类不能实例化,因为它的抽象方法没有方法体。

  2. 抽象类必须有子类,并且这个子类需要实现抽象类中的所有抽象方法,在重写抽象类的方法时,需要注意抽象方法的访问权限,一定要大于等于抽象方法的访问权限。

           abstract default void print();
           此时子类要是重写这个方法就只能用public或者default关键字修饰
    
  3. 有一种情况子类可以不用全部实现抽象类的方法,那就是这个子类也是抽象类,那么没有实现的方法就交给这个抽象类的子类去实现就好了。

  4. 抽象类的对象可以通过对象的多态性利用子类为其实例化;

            Animal animal = new Dog();
    
  5. 抽象方法不能用private关键字修饰,private修饰的属性和方法对于子类来说是隐式继承的,子类并不知道父类有private修饰的属性和方法,抽象方法存在的目的就是为了子类去实现它,私有化就没有意义了,所以抽象方法不能私有化。

  6. 抽象类中可以不定义抽象方法,但是这个抽象类仍然不能直接实例化。

  7. 抽象类不能使用final修饰,因为final修饰的类不能有子类,而抽象类必须有子类。

我们看一段特殊的代码:

abstract class A{
    public A(){
        this.print();//3.调用被子类重写的print方法
    }
    public abstract void print();
}
class B extends A{
    private int num = 10;
    public B(int num){
        //super();  隐含这句调用父类构造方法的句子     2.调用父类构造
        this.num = num;//5.为类中的属性初始化
    }

    @Override
    public void print() {
        System.out.println(this.num);//4.这是的num还是初始值0,打印输出
    }
}
public class TestDemo {
    public static void main(String[] args) {
        new B(30);//1.调用子类构造方法
    }
}

输出结果为0

写这个代码的作用是让大家了解抽象类内部怎样调用的,与普通类的调用是一样的,所以大家不要被抽象类的表面所迷惑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值