标签:java之抽象类
1.抽象类概述
package com; class Animal{ public void eat(){ System.out.println("动物吃东西"); } public void sleep(){ System.out.println("动物睡觉"); } } class Dog extends Animal{ @Override public void eat(){ System.out.println("猫吃东西"); } @Override public void sleep(){ System.out.println("猫睡觉"); } } class Cat extends Animal{ @Override public void eat(){ System.out.println("狗吃东西"); } @Override public void sleep(){ System.out.println("狗睡觉"); } } public class AnimalTest { public static void main(String[] args) { Animal a = new Dog(); a.eat(); } }
从上面的代码,我们开始思索。动物不是一个具体的事物,而是一个抽象的事物。只有真正的猫、狗才是具体的动物。同理,我们可以推想,不同的动物吃的东西也应该是不一样的。所以,我们不应该在动物类中给出具体的实现细节,而是应该给出一个声明即可。在Java中,一个没有方法体的方法应该被定义为抽象方法,而类中如果有抽象方法,那么该类被称为抽象类。
2.抽象类特点
抽象类和抽象方法必须用abstract关键字修饰。
格式:
abstract class 类名{}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。
抽象类不能被实例化。因为它不是具体的。抽象类有构造方法,但是不能实例化?那么构造方法的作用是什么?用于子类访问父类数据的初始化。
抽象类的子类,要么是抽象类,要么实现抽象类中的所有抽象方法。
package com; abstract class Animal{ public abstract void eat(); public abstract void sleep(); } class Dog extends Animal{ @Override public void eat(){ System.out.println("猫吃东西"); } @Override public void sleep(){ System.out.println("猫睡觉"); } } class Cat extends Animal{ @Override public void eat(){ System.out.println("狗吃东西"); } @Override public void sleep(){ System.out.println("狗睡觉"); } } public class AnimalTest { public static void main(String[] args) { Animal a = new Dog();//多态 a.eat(); } }
3.抽象类成员特点
成员变量:既可以是变量,也可以是常量。
构造方法:有,用于子类访问父类数据的初始化。
成员方法:既可以是普通方法,也可以是抽象方法。
抽象类的成员方法特性:
抽象方法:强制要求子类做事情。
普通方法:让子类去继承,提高代码的复用性。
4.抽象类案例
package com; /** * 具体事务:猫 狗 * 共性:姓名 年龄 吃饭 * * 分析:从具体到抽象 * 猫: * 成员变量:姓名 年龄 * 成员方法:吃饭(猫吃鱼) * 狗: * 成员变量:姓名 年龄 * 成员方法:吃饭(狗吃肉) * * 因为有共性的内容,所以就提取了父类--动物。 * 但是由于吃饭的内容不一样,所以吃饭的方法是抽象的。 * 而方法是抽象的,所以动物类必须为抽象类。 * * 抽象类: * 成员变量: 姓名 年龄 * 成员方法: 吃饭() * * 实现:从抽象到具体 * 动物类: * 成员变量: 姓名 年龄 * 成员方法: 吃饭() * 狗类: * 继承自动物的类,重写吃饭() * 猫类: * 继承自动物的类,重写吃饭() */ //抽象类---动物类 abstract class Animal{ private String name;//姓名 private int age;//年龄 //无参构造方法 public Animal(){} //有参数构造方法 public Animal(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public abstract void eat(); } //具体类--狗类 class Dog extends Animal{ //无参构造方法 public Dog(){} //有参数构造方法 public Dog(String name,int age){ super(name, age); } @Override public void eat() { System.out.println("狗吃肉"); } } //具体类--猫类 class Cat extends Animal{ //无参构造方法 public Cat(){} //有参构造方法 public Cat(String name,int age){ super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } } public class AbstractTest { public static void main(String[] args) { Animal a = new Dog("旺财",2); System.out.println("狗的姓名:"+a.getName()+",年龄:"+a.getAge()); a.eat(); a = new Cat("进宝",3); a.eat(); System.out.println("猫的姓名:"+a.getName()+",年龄:"+a.getAge()); } }
package com; /** * 具体事物:语文老师 数学老师 * 共性:姓名 年龄 讲课 * * 分析: * 语文老师 * 姓名 年龄 * 讲课 * 数学老师 * 姓名 年龄 * 讲课 * 实现: * 老师类 * 语文老师 * 数学老师 */ //抽象类--老师类 abstract class Teacher{ private String name;//姓名 private int age;//年龄 //无参构造方法 public Teacher(){} //有参数构造方法 public Teacher(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * 讲课 */ public abstract void teach(); } //语文老师类 class ChineseTeacher extends Teacher{ //无参构造方法 public ChineseTeacher(){} //有参构造方法 public ChineseTeacher(String name,int age){ super(name,age); } @Override public void teach() { System.out.println("讲语文"); } } //数学老师类 class MathTeacher extends Teacher{ //无参构造方法 public MathTeacher() {} //有参构造方法 public MathTeacher(String name,int age){ super(name, age); } @Override public void teach() { System.out.println("讲数学"); } } //测试类 public class AbstractTest1 { public static void main(String[] args) { Teacher t = new ChineseTeacher("语文老师哈哈", 40); System.out.println("语文老师姓名:"+t.getName()+",年龄:"+t.getAge()); t.teach(); t = new MathTeacher("数学老师呵呵", 22); System.out.println("数学老师姓名:"+t.getName()+",年龄:"+t.getAge()); t.teach(); } }
package com; /** * 学生案例 * 具体事物:文科班学员 理科班学员 * 共性:姓名 年龄 班级 学习 吃饭 * 分析: * 文科班学员 * 成员变量:姓名 年龄 班级 * 成员方法:学习 吃饭 * 理科班学员 * 成员变量:姓名 年龄 班级 * 成员方法:学习 吃饭 * 得到一个学员类: * 成员变量:姓名 年龄 班级 * 成员方法:学习 吃饭 * 实现: * 学员类: * 文科班学员 * 理科班学员 * */ //定义抽象类 学员类 abstract class Employee{ private String name;//姓名 private int age;//年龄 private String classMate;//班级 //无参构造方法 public Employee(){} //有参构造方法 public Employee(String name,int age,String classMate){ this.name = name; this.age = age; this.classMate = classMate; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassMate() { return classMate; } public void setClassMate(String classMate) { this.classMate = classMate; } /** * 吃饭 */ public void eat(){ System.out.println("吃饭"); } /** * 学习 */ public abstract void study(); } //文科学员 class LiberalEmployee extends Employee{ //无参构造方法 public LiberalEmployee(){} //有参构造方法 public LiberalEmployee(String name,int age,String classMate){ super(name, age, classMate); } @Override public void study() { System.out.println("学习文科"); } } //理科学员 class ScienceEmployee extends Employee{ //无参构造方法 public ScienceEmployee(){} //有参构造方法 public ScienceEmployee(String name,int age,String classMate){ super(name, age, classMate); } @Override public void study() { System.out.println("学习理科"); } } //测试类 public class AbstractTest2 { public static void main(String[] args) { Employee e = new LiberalEmployee("文科学员哈哈",20,"文科班01班"); System.out.println("文科班学员姓名:"+e.getName()+",年龄:"+e.getAge()+",班级:"+e.getClassMate()); e.eat(); e.study(); e = new ScienceEmployee("理科学员呵呵", 18, "理科班01班"); System.out.println("理科班学员姓名:"+e.getName()+",年龄:"+e.getAge()+",班级:"+e.getClassMate()); e.eat(); e.study(); } }
package cn; /** * 假如我们在开发一个系统时需要对员工类进行设计。 * 员工包含3个属性:姓名、工号以及工资。 * 经理也是员工,除了含有员工的属性外,还有一个奖金的属性。 * 请使用继承的思想设计出员工类和经理类。 * 要求类中提供必要的方法进行属性访问。 */ //员工类 abstract class Employee{ private String name;//姓名 private String empno;//编号 private double salary;//薪水 public Employee(){} public Employee(String name,String empno,double salary){ this.empno = empno; this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmpno() { return empno; } public void setEmpno(String empno) { this.empno = empno; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } /** * 工作 */ public abstract void work(); } //程序员 class Programmer extends Employee{ //无参构造方法 public Programmer(){} //有参构造方法 public Programmer(String name,String empno,double salary){ super(name, empno, salary); } @Override public void work() { System.out.println("按照需求写代码"); } } //经理 class Manager extends Employee{ private double bonus;//奖金 //无参构造方法 public Manager(){} //有参构造方法 public Manager(String name,String empno,double salary,double bonus){ super(name, empno, salary); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public void work() { System.out.println("和客户谈需求"); } } //测试类 public class AbstractTest { public static void main(String[] args) { Employee e = new Programmer("程序员哈哈", "001", 5000); System.out.println("姓名:"+e.getName()+"编号:"+e.getEmpno()+"薪水:"+e.getSalary()); e.work(); e = new Manager("经理呵呵", "01", 10000, 5000); System.out.println("姓名:"+e.getName()+"编号:"+e.getEmpno()+"薪水:"+e.getSalary()+"奖金:"+((Manager)e).getSalary()); e.work(); } }
5.抽象类小问题
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义。
可以,不让创建对象。
abstract关键字和private关键字、final关键字冲突和static关键字无意义。
本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1858993
标签:java之抽象类
原文地址:http://11841428.blog.51cto.com/11831428/1858993