抽象类、抽象方法

一、抽象类

抽象类和普通类的区别
抽象类不能实例化(抽象类中包含有抽象方法,而抽象方法不包含方法体,即没有具体实现),因此抽象类不能直接产生实例化对象;比普通类多了一些抽象方法

  • 抽象类只是在普通类的基础上扩充了一些抽象方法,这些方法只声明而未实现,所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义。
  • 允许(但不要求)抽象类包含抽象成员
  • 因此在抽象类中也允许提供构造方法,并且子类也照样遵循对象实例化流程。实例化子类时一定先调用父类构造方法,如果父类没有无参构造,那么子类构造必须使用super明确指出使用父类哪个构造方法。
  • 抽象类派生非抽象类时,非抽象类必须实现所继承的所有抽象成员,从而重写那些抽象成员
  • abstract class类名{ //声明类成员 }
    关于抽象类的使用原则
    (1)所有的抽象类必须有子类,如果一个类包含一个或多个抽象方法,则该类必须限定为抽象
    (2)抽象类的子类必须覆写抽象类的所有抽象方法(子类不是抽象类)【方法覆写一定要考虑权限问题,权限尽量都用public】
    (3)抽象类的对象可以通过对象多态性(覆写)利用子类为其实例化
    (4)抽象类也分为内部抽象类和外部抽象类。内部抽象类中也可以使用static定义来描述外部抽象类
//使用static修饰内部抽象类是正确的
//如果加在static abstract class Person是错误的
abstract class Person {
    public abstract void getPersonInfo();
    static abstract class Person1{
        public abstract void get();
    }
}
class Student extends Person {
    @Override
    public void getPersonInfo() {}
    class  Student1 extends Person1{
        @Override
        public void get() { }
    }
}
或者是
class Student extends Person.Person1 {
        public void get() { }
    }

重点:
       抽象类一定不能使用final声明,因为使用final声明的类不允许有子类;而抽象类必须有子类,也不能用private定义,这属于密封类不能被访问;相应的,抽象方法也不能使用private定义,因为抽象方法必须要能被覆写 。
把类或者方法声明为抽象,表示该类或方法必须被重写或继承
以下是一般情况下的抽象类实现

abstract class Father {
    private String name;
    abstract void test();
    public void method() {
        System.out.println("抽象类的方法");
    }
}

class Son extends Father {
    @Override
    void test() {
        System.out.println("覆写抽象类的方法");
    }
}

public class AbstractClass {
    public static void main(String[] args) {
        Father father = new Son();
        father.test();
    }
}

以下使用内部类的方法继承抽象类实现抽象类的方法,封装了Son,即子类

abstract class Father {
    private String name;
    abstract void test();
    public void method() {
        System.out.println("抽象类的方法");
    }
    public static Father getInstance(){
        class Son extends Father{
            @Override
            void test() {
                System.out.println("(内部类)覆写抽象类的方法");
            }
        }
        return new Son();
    }
}
public class AbstractClass {
    public static void main(String[] args) {
        Father father =Father.getInstance();
        father.test();
    }
}

二、抽象方法

  • public abstract void 方法名();
  • 除构造方法、静态方法、私有方法不能声明为抽象方法外,其他方法都可以声明为抽象方法
  • 一个派生类从基类继承了抽象方法,则必须重写以实现所有的抽象方法,要么使用abstract关键字声明派生类为抽象类
  • 不能引用抽象方法
  • 当抽象类从基类继承成员方法时, 抽象类可以使用抽象方法重写从基类继承的成员方法,继承抽象方法的类无法访问该方法的原始实现
  • 所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类

三、abstract的使用

abstract与其他修饰符的关系

  • final与abstract不能共存:
    final:它的作用是修饰类代表不可以继承,修饰方法不可重写;
    abstract:修饰类就是用来被继承的,修饰方法就是用来重写的;
  • static与abstract不能共存:
  • abstract修饰的方法没有具体的方法实现,所以不能直接调用
    static修饰的方法可以用类名调用
  • private与abstract不能共存:
  • private修饰的只能在本类中使用
  • abstract方法是用来被子类进行重写的,有矛盾
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值