java-抽象类

约定不等于承诺〃 2022-06-13 14:20 361阅读 0赞

抽象类

怎样理解抽象类:
打个形象的比喻:
我们以前定义一个动物类,动物有吃的行为,但是我们没有指定这是哪个动物(不是一个具体的事物),而且动物吃的行为也不知道是哪种具体吃的行为。所以这里我们所指的动物类就可以看做是一个抽象类。这个动物拥有动物的属性和方法。

特点:
1-抽象类和抽象方法必须用abstract关键字修饰。
2-抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3-抽象类不能直接实例化(可通过多态实现),因为它不是具体的类。(但是有构造方法)
4-抽象类是有构造方法的,只是不能实例化,用于子类访问父类数据的初始化。
抽象类的子类:
1- 不重写抽象方法,抽象类的子类是一个抽象子类
2-重写父类所有父类方法,子类不是抽象类(可通过该子类可实例化抽象父类)
例如:动物类
abstract class Animal{
public abstract void eat();
}
注意:抽象类中可以没有抽象方法。
抽象方法不能有方法体。
注意:空方法体和没有方法体的区别。

抽象类的成员特点:
成员变量:
既可以是变量也可以是常量。
构造方法:
有构造方法,用于子类访问父类数据的初始化。
成员方法:
抽象类中方法既可以是抽象的,也可以是非抽象方法。
在父类中:
非抽象方法:子类继承的事情,提高代码的复用性
抽象方法:强制要求子类做的事情。

抽象类中注意的问题:
一个类如果没有抽象方法,可以是抽象类,即抽象类中可以完全没有抽象方法。
这样类的主要目的就是不让创建该类对象。

abstract关键字不可以个那些关键字使用。
private 冲突;private修饰的成员不能被继承,从而不可以被子类重写,而abstract修饰的是要求被重写的。
final 冲突;final修饰的成员是最终成员,不能被重写,所以冲突,
static 无意义;static修饰成员用类名可以直接访问,但是abstract修饰成员没有方法体,所以访问没有方法体的成员无意义。

案例:定义一个动物类:

  1. package day09;
  2. public abstract class AnimalDe1 {
  3. private String name;
  4. private int age;
  5. public AnimalDe1(){};
  6. public AnimalDe1(String name,int age){
  7. this.name=name;
  8. this.age=age;
  9. }
  10. public String getName(){
  11. return name;
  12. }
  13. public void setName(String name){
  14. this.name=name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public abstract void eat();
  23. }

定义一个狗类:

  1. package day09;
  2. public class DogDe1 extends AnimalDe1 {
  3. public DogDe1(){}
  4. public DogDe1(String name,int age){
  5. super(name,age);
  6. }
  7. public void eat() {
  8. System.out.println("狗吃肉!!!");
  9. }
  10. }

定义一个猫类:

  1. package day09;
  2. public class CatDe1 extends AnimalDe1 {
  3. public CatDe1(){}
  4. public CatDe1(String name,int age){
  5. super(name,age);
  6. }
  7. public void eat() {
  8. System.out.println("猫吃鱼!!!");
  9. }
  10. }

测试类:

  1. package day09;
  2. public class MainDe1 {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. DogDe1 dd = new DogDe1();//调用无参构造实现
  8. dd.setName("狗狗1");
  9. dd.setAge(2);
  10. System.out.println(dd.getName()+"年龄:"+dd.getAge());
  11. dd.eat();
  12. System.out.println("------------------");
  13. DogDe1 dd1 = new DogDe1("狗狗2",3);//通过调用有参构造方法实现
  14. System.out.println(dd1.getName()+"年龄:"+dd1.getAge());
  15. dd1.eat();
  16. System.out.println("------------------");
  17. AnimalDe1 dd2 = new DogDe1();//多态实现
  18. dd2.setName("狗狗3");
  19. dd2.setAge(4);
  20. System.out.println(dd2.getName()+"年龄:"+dd2.getAge());
  21. dd2.eat();
  22. }
  23. //猫类同理!!
  24. }

输出:

狗狗1年龄:2
狗吃肉!!!
-————————-
狗狗2年龄:3
狗吃肉!!!
-————————-
狗狗3年龄:4
狗吃肉!!!

案例e2:

定义一个老师类:

  1. package day09;
  2. public abstract class Teacher {
  3. private String name;
  4. private int age;
  5. public Teacher(){}
  6. public Teacher(String name, int age){
  7. this.name=name;
  8. this.age=age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public abstract void teach();
  23. }

定义一个基础老师类:

  1. package day09;
  2. public class BasicTeacher extends Teacher {
  3. public BasicTeacher(){}
  4. public BasicTeacher(String name,int age){
  5. super(name,age);
  6. }
  7. public void teach() {
  8. System.out.println("基础班"+super.getName()+"老师交基础课程!!");
  9. }
  10. }

定义一个高级老师类:

  1. package day09;
  2. public class BasicTeacher extends Teacher {
  3. public BasicTeacher(){}
  4. public BasicTeacher(String name,int age){
  5. super(name,age);
  6. }
  7. public void teach() {
  8. System.out.println("基础班"+super.getName()+"老师交基础课程!!");
  9. }
  10. }

测试类:

  1. package day09;
  2. public class MainTeacher {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. Teacher bt = new BasicTeacher();//实现多态
  8. bt.setName("李春男");
  9. bt.setAge(24);
  10. System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
  11. bt.teach();
  12. System.out.println("--------------");//
  13. bt = new BasicTeacher("杨莉",24);//有参构造方法实现
  14. System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
  15. bt.teach();
  16. System.out.println("--------------");//
  17. bt = new HighTeacher();//多态拓展,高级老师
  18. bt.setName("李春男");
  19. bt.setAge(24);
  20. bt.teach();
  21. System.out.println("--------------");//
  22. bt = new HighTeacher("杨莉",24);//有参构造方法实现
  23. System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
  24. bt.teach();
  25. }
  26. }

输出:
姓名:李春男,年龄:24
基础班李春男老师交基础课程!!
-——————-
姓名:杨莉,年龄:24
基础班杨莉老师交基础课程!!
-——————-
高级班老师李春男交基础课程!!
-——————-
姓名:杨莉,年龄:24
高级班老师杨莉交基础课程!!

案例三:员工类:

  1. package day09;
  2. public abstract class Employee {
  3. private String name;
  4. private int id;
  5. private int salary;
  6. public Employee(){}
  7. public Employee(String name,int id,int salary){
  8. this.name=name;
  9. this.id=id;
  10. this.salary = salary;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getId() {
  19. return id;
  20. }
  21. public void setId(int id) {
  22. this.id = id;
  23. }
  24. public int getSalary() {
  25. return salary;
  26. }
  27. public void setSalary(int salary) {
  28. this.salary = salary;
  29. }
  30. public abstract void work();
  31. }

程序员类:

  1. package day09;
  2. public class Programer extends Employee {
  3. public Programer(){}
  4. public Programer(String name,int id,int salary){
  5. super(name,id,salary);
  6. }
  7. public void work() {
  8. System.out.println("根据需求写代码!");
  9. }
  10. }

经理类:

  1. package day09;
  2. public class Manager extends Employee {
  3. private int bounds;//奖金
  4. public Manager(){}//无参构造
  5. public Manager(String name,int id,int salary,int bounds){//有参构造
  6. super(name,id,salary);//传参
  7. this.bounds=bounds;//传参
  8. }
  9. public void work() {
  10. System.out.println("和客户谈需求!!!");
  11. }
  12. public int getBounds() {
  13. return bounds;
  14. }
  15. public void setBounds(int bounds) {
  16. this.bounds = bounds;
  17. }
  18. }

测试类:

  1. package day09;
  2. public class EmployeeMain {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. //多态实现
  8. Employee emp = new Programer();
  9. emp.setName("李春男");
  10. emp.setId(10001);
  11. emp.setSalary(8000);
  12. System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());
  13. emp.work();
  14. System.out.println("********************************");
  15. Employee emp1 = new Programer("李春男",10001,8000);
  16. emp.setSalary(8000);
  17. System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());
  18. emp.work();
  19. //经理类
  20. /* emp = new Manager();
  21. emp.setName("杨莉");
  22. emp.setId(2001);
  23. emp.setSalary(6000);
  24. //emp.setBounds(1100);//编译看左边,emp是父类对象引用,而bounds是子类中特有的成变量,所以不能访问,报
  25. 错!!
  26. */
  27. //当遇到有子类特殊变量或者方法时,以上方式不可取,而是直接用具体的类创建对象
  28. Manager man = new Manager();
  29. man.setName("杨莉");
  30. man.setId(2001);
  31. man.setSalary(5000);
  32. man.setBounds(1200);
  33. System.out.println("姓名:"+man.getName()+"编号:"+man.getId()+"薪金"+man.getSalary());
  34. man.work();
  35. System.out.println("*********************************");
  36. Manager man1 = new Manager("杨莉",2001,5000,1200);
  37. System.out.println("姓名:"+man1.getName()+"编号:"+man1.getId()+"薪金"+man1.getSalary());
  38. man1.work();
  39. }
  40. }

输出:

姓名:李春男编号:10001薪金8000
根据需求写代码!
********************************
姓名:李春男编号:10001薪金8000
根据需求写代码!
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!
*********************************
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JAVA抽象抽象方法

    类的继承的作用主要在于可以扩充已有类的功能,子类继承后可以任意选择是否实现父类的方法,想实现就实现,不想实现就不实现。换句话说,父类无法对子类是否实现自己的某个方法做强制的约定

    相关 java抽象抽象

    先来说一下抽象与接口的区别:抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。 jav

    相关 java-抽象

    抽象类 怎样理解抽象类: 打个形象的比喻: 我们以前定义一个动物类,动物有吃的行为,但是我们没有指定这是哪个动物(不是一个具体的事物),而且动物吃的行为也不知道是哪种

    相关 Java 抽象

    通过继承,子类获得父类的变量和方法。 在Java中,只声明而没有实现的方法称为抽象方法,其语法规则如下: abstract <返回值类型> <抽象方法名>(\[<形式参数列

    相关 Java抽象

    1、特点 a、抽象类和抽象方法必须用abstract来修饰。抽象方法不能有主体(只写名字,不加大括号\{\}) b、抽象类中不一定有抽象方法,但是抽象方法必须在抽象类中

    相关 Java 抽象

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 ...