JAVA基础(抽象类)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,违者必究。 https://blog.csdn.net/Cricket_7/article/details/91490012

1,抽象类概述

  • 抽象就是看不懂的

2,抽象类特点

,【1】抽象类和抽象方法必须用abstract关键字修饰

  • abstract class 类名 {}

  • public abstract void eat();

【2】抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口

  • 抽象类不能实例化那么,抽象类如何实例化呢?   不能new出来

  • 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

【3】抽象类的子类

  • 要么是抽象类

  • 要么重写抽象类中的所有抽象方法

class Demo1_Abstract {

    public static void main(String[] args) {

        //Animal a = new Animal();            //错误: Animal是抽象的; 无法实例化

        Animal a = new Cat();                //父类引用指向子类对象

        a.eat();

    }

}

abstract class Animal {                        //抽象类

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





    public Animal() {

        System.out.println("父类空参构造");

    }

    public void print(){

    }

}

class Cat extends Animal {

    public Cat() {

        super();

    }

    public void eat() {

        System.out.println("猫吃鱼");

    }

}

【4】案例演示

3,抽象类的成员特点

【1】成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量

【2】构造方法:有,用于子类访问父类数据的初始化。

【3】成员方法:既可以是抽象的,也可以是非抽象的。

【4】抽象类的成员方法特性:

  • 抽象方法 强制要求子类做的事情。

  • 非抽象方法 子类继承的事情,提高代码复用性。

class Demo2_Abstract {

    public static void main(String[] args) {

        System.out.println("Hello World!");

    }

}

abstract class Demo {

    int num1 = 10;

    final int num2 = 20;

    public Demo(){}

    public void print() {

        System.out.println("111");

    }

    public abstract void method();

}

class Test extends Demo {

    public Test(){

        super();

    }

    public void method() {

        System.out.println("111");

    }

}

4,abstract 使用注意事项

【1】一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

  • 可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

【2】abstract不能和哪些关键字共存

    abstract和static

    被abstract修饰的方法没有方法体

    被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的

    abstract和final

    被abstract修饰的方法强制子类重写

    被final修饰的不让子类重写,所以他俩是矛盾

    abstract和private

    被abstract修饰的是为了让子类看到并强制重写

    被private修饰不让子类访问,所以他俩是矛盾的


 

abstract class Demo {

    //public static abstract void print();        //错误: 非法的修饰符组合: abstract和static

    //public final abstract void print();        //错误: 非法的修饰符组合: abstract和final

    private abstract void print();                //错误: 非法的修饰符组合: abstract和private

}

5,抽象类,案例

【1】需求

  • 假如我们在开发一个系统时需要对程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。

  • 经理,除了含有程序员的属性外,另为还有一个奖金属性。

  • 请使用继承的思想设计出程序员类和经理类。要求类中提供必要的方法进行属性访问。


 

class Test3_Employee {

    public static void main(String[] args) {

        Coder c = new Coder("德玛西亚","007",8000);

        c.work();





        Manager m = new Manager("苍老师","9527",3000,20000);

        m.work();

    }

}



abstract class Employee {

    private String name;                    //姓名

    private String id;                        //工号

    private double salary;                    //工资





    public Employee() {}                    //空参构造





    public Employee(String name,String id,double salary) {

        this.name = name;

        this.id = id;

        this.salary = salary;

    }





    public void setName(String name) {        //设置姓名

        this.name = name;

    }





    public String getName() {                //获取姓名

        return name;

    }





    public void setId(String id) {            //设置id

        this.id = id;

    }





    public String getId() {                    //获取id

        return id;

    }





    public void setSalary(double salary) {    //设置工资

        this.salary = salary;

    }





    public double getSalary() {                //获取工资

        return salary;

    }





    public abstract void work();

}





//程序员

class Coder extends Employee {

    public Coder() {}                    //空参构造





    public Coder(String name,String id,double salary) {

        super(name,id,salary);

    }





    public void work() {

        System.out.println("我的姓名是:" + this.getName() + ",我的工号是:" + this.getId() + ",我的工资是:"

            + this.getSalary() + ",我的工作内容是敲代码");

    }

}





//项目经理

class Manager extends Employee {

    private int bonus;                    //奖金

    public Manager() {}                    //空参构造





    public Manager(String name,String id,double salary,int bonus) {

        super(name,id,salary);

        this.bonus = bonus;

    }





    public void work() {

        System.out.println("我的姓名是:" + this.getName() + ",我的工号是:" + this.getId() + ",我的工资是:"

            + this.getSalary() + ",我的奖金是:" + bonus + ",我的工作内容是管理");

    }

}

猜你喜欢

转载自blog.csdn.net/Cricket_7/article/details/91490012