Java抽象类

Pragma mark — NO.1 基础代码
public class ChouxiangLei {

    public  static  void main(String[] args){
        // Animal1 a = new Animal1(); Animal1是无法被实例化的,因为这个eat方法
        //是一个抽象方法,没有实现,如果我们可以实例化类,那么就可以调用这个eat方法,这是不允许的
        Animal1 a = new Cat1();//父类引用指向子类对象--多态啊
        a.eat();
    }

}
//创建一个抽象类--abstract是抽象的关键字

//抽象类:不知道类内部是怎样的,有什么成员变量,有什么方法
//抽象方法:不知道方法内部该怎么实现

/*
* 抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类或者接口
*B:抽象类不能实例化,那么如何实例化呢?
* 按照多态的方式,由具体的子类实例化,其实这也是多态的一种:抽象类多态
* C:抽象类的子类:
* 要么是抽象类
* 要么重写抽象类中的所有抽象方法
* */
abstract  class Animal1{

   //抽象方法--注意抽象方法后面不接这个方法实现的中括号了
    public abstract void eat();
}

//创建一个子类继承自Animal1 -- 对于这个子类来说,继承自抽象类,那么必须重写父类所有的抽象方法
class  Cat1 extends Animal1{
     public  void eat(){
         System.out.println("猫要吃鱼”);
    }
}

Pragma mark — NO.2 抽象类特点
public class ChouXianglei2 {

    public static void  main(String[] args){

     SubDemo s = new SubDemo();
     s.method();

    }

}
/*
* A:抽象类的成员特点
* a:成员变量:既可以是变量,也可以是常量。 abstract 不能修饰成员变量
* b:构造方法:有
* 用于子类访问父类数据的初始化
* c:成员方法:既可以是抽象的,也可以不是
* */
//创建一个抽象类--抽象类中可以有哪些东西
abstract  class  Demo {
    int num1 = 10;//变量
    final  int num2 = 20;//常量
    //构造方法
    public  Demo(){
        //我们在super的构造中写点东西\
        System.out.println("我是构造方法");
    }

    //普通方法
    public void print(){

        System.out.println("我是普通方法");
    }
    //抽象方法
    public abstract  void method();
}

//搞个子类
class  SubDemo extends Demo{
    public SubDemo(){
        //在子类的构造方法中隐藏了super
        super();
    }
    //子类必须要重写抽象父类的抽象方法
    public void method(){
        System.out.println("我是子类,重写了父类的抽象方法");
    }
}

Pragma mark — NO.3 葵花宝典的例子说明父类强制子类执行
public class ChouXianglei3 {
    public static void main (String[] args){
        //分别创建这三个人类
        DongFbb dongfang = new DongFbb();
        Yuebq yue = new Yuebq();
        Lingpz ling = new Lingpz();

        dongfang.Zigong();
        yue.Zigong();
        ling.Zigong();
    //这个例子告诉我们,父类要求子类强制执行的,你要练我神功,就必须实现自宫这一步.
    }
}

/*
* 以葵花宝典举例说明这个抽象类
* */
//创建一个葵花宝典的抽象类
abstract class Kuihuabaodian{
    //创建一个抽象方法--自宫
    //创建这个方法的意思是:你只要练我这个武功,你就得自宫
    public abstract void Zigong();
}
//接下来有人要练这个葵花宝典了,那么就得继承自这个抽象类
//假如东方不败练这个东西
class DongFbb extends Kuihuabaodian{
    public  void Zigong(){
        System.out.println("欲练此功,必先自宫--用刀");
    }
}
//我们再来一个人岳不群练这个
class Yuebq extends Kuihuabaodian{
    public void Zigong(){
        System.out.println("欲练此功,必先自宫--用牙签");
    }
}
//我们再来一个人林平之练这个
class Lingpz extends Kuihuabaodian {
    public void Zigong() {
        System.out.println("欲练此功,必先自宫--用指甲刀");
    }
}
Pragma mark — NO.4 简单猫狗案例
public class ChouXianglei4 {

    public static void main (String[] args){

     //创建对象
        Cat12 c = new Cat12("lingling",18);
        Dog2 d = new Dog2("dulan",22);

        //调用方法
        c.eat();
        c.catchMouse();

        d.eat();
        d.lookHome();
    }
}

/*
* 案例演示:
* 具体事物:猫,狗
* 共性:姓名,年龄,吃饭
* 猫的特性:抓老鼠
* 狗的特性:看家
**/

//抽取一个父类--动物类
abstract class  Animal2 {

    private  String name;
    private  int age;

    public Animal2(){}

    public Animal2(String name, int age){

        this.name = name;
        this.age = age;
    }

    //set/get方法
    public void setName(String name){

        this.name = name;
    }

    public String getName(){

        return name;
    }

    public void setAge(int age){

        this.age = age;
    }

    public int getAge(){
        return age;
    }

    //这里有个吃饭方法,我们无法确定,定义为抽象方法

    public abstract void eat();


}
//定义猫类
class  Cat12 extends Animal2{

    //写上有参和无参构造
    public Cat12(){}

    public Cat12(String name, int age){

//        this.name = name;
//        this.age = age;//这里不能直接this,因为本类中并没有name和age的成员
        //可以直接调用父类的,让父类去给我们构建
        super(name,age);
    }
//重写抽象类的抽象方法
    public void eat(){

        System.out.println("猫要吃鱼");
    }
    //自身特有方法
    public  void catchMouse(){
        System.out.println("我要抓老鼠");
    }

}
//定义狗类
class Dog2 extends Animal2{

    //写上有参和无参构造
    public Dog2(){}

    public Dog2(String name, int age){
        super(name,age);
    }
    public void eat(){
        System.out.println("狗要吃骨头");
    }
    public void lookHome(){
        System.out.println("我会看家");
    }

}
Pragma mark — NO.5 面试题
1.一个抽象类如果没有抽象方法,可不可以定义为抽象类,有什么意义?
答:可以,作用是:目的只有一个,就是不让其它类创建本类对象,交给子类去调用。
2.abstract关键字不能和哪些关键字共存
答:
(1).不能和static共存:
 被abstract修饰的方法没有方法体,被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
(2).不能和final共存:
 被abstract修饰的方法强制子类重写
 被final修饰的不让子类重写,所以这两个是矛盾的 
(3).private和abstract:
被abstract修饰的是为了让子类看到并强制重写
被private修饰不让子类访问,所以这两个是矛盾的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容