1、抽象类
我们把一个不具体的功能,叫做抽象方法,而如果一个类中有抽象方法,
我们就把这个类称之为抽象类。
2、抽象类的特点:
(1)抽象类和抽象方法都要用一个关键字修饰:abstract
修饰一个类 放在class的前面
举例: abstract class Animal3{}
修饰一个方法 一般是放在权限修饰符后面
定义一个抽象的show方法
举例:public abstract void show();
(2)有抽象方法的类一定要是抽象类,抽象类不一定要有抽象方法,具体的类中不能有抽象方 法,抽象类中既可以存在抽象方法,也可以存在有方法体的方法。
(3)抽象类不能被实例化
既然不能被实例化,那写在抽象类中的方法如何被调用呢?
抽象类如何创建呢?
通过多态的形式,使用具体的子类去实例化调用方法,专业术语称之为:抽象多态
(4)如果继承抽象类的是一个具体的子类,需要重写该抽象类中所有的抽象方法
如果继承抽象的也是一个抽象类,可以不去重写父类中的抽象方法,也可以选择性的去重写。
//定义了一个抽象类,叫Animal3
abstract class Animal3{
//注意:
//抽象方法没有方法体{},连大括号都没有,直接以分号结尾
//java: 抽象方法不能有主体
// public abstract void eat(){};
public abstract void eat();
public abstract void drink();
}
class Dog3 extends Animal3{
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void drink() {
System.out.println("狗喝水");
}
}
//class Demo2{
// public abstract void fun1();
//}
abstract class Demo2{
public abstract void fun();
public abstract void fun2();
}
abstract class Demo3 extends Demo2{
@Override
public void fun() {
System.out.println("抽象类Demo3中重写了fun方法");
}
}
public class AbstractDemo1 {
public static void main(String[] args) {
//java: com.shujia.wyh.day11.Demo2是抽象的; 无法实例化
// Demo2 demo2 = new Demo2();
//利用具体子类多态形式创建对象
//抽象多态的形式
Animal3 a = new Dog3();
a.eat();
a.drink();
}
}
3、抽象类的成员的特点:
(1)成员变量:
既可以是变量,也可以是常量
(2)构造方法:
可以存在构造方法,我们上一个程序中,才总结出抽象类不能被实例化,这里构造方法意 义是什么?
我们之前在继承中还说过要想初始化子类,必须先初始化父类,所以这里构造方法是提供 初始化父类的作用
(3)成员方法:
可以是抽象方法,但是具体的子类必须要重写该方法
也可以不是抽象方法,提高代码的复用性。
abstract class Animal4{
int a = 20;
final int b = 100;
Animal4(){
System.out.println("这是Animal4中无参构造方法");
}
public abstract void eat();
public void show(){
System.out.println("父类中不是抽象方法的show");
}
}
class Cat4 extends Animal4{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class AbstractDemo2 {
public static void main(String[] args) {
Animal4 a = new Cat4();
System.out.println(a.a);
System.out.println(a.b);
a.eat();
a.show();
}
}
4、 (1)一个类如果没有抽象方法,也可以定义为抽象类
(2)抽象类中可以没有抽象方法
(3)抽象类不能被实例
(4)抽象类中可以存在哪些关键字?
abstract关键字不能和哪些关键字共存?
private
static
final
abstract class YeTi{
//Java中的所有的类都有一个共同的父类:Object
// YeTi(){
// // super()
// }
//abstract可以和public关键字共存
public abstract void show();
//private和abstract关键字冲突
// private abstract void show2(); // java: 非法的修饰符组合: abstract和private
//static和abstract关键字冲突
// static abstract void show3(); // java: 非法的修饰符组合: abstract和static
//final和abstract关键字冲突
// final abstract void show4(); // java: 非法的修饰符组合: abstract和final
}
public class AbstractDemo3 {
public static void main(String[] args) {
}
}
5、抽象类改进猫狗案例
abstract class Animal5{
//定义一个吃饭的抽象方法,不给出具体的实现
public abstract void eat();
//定义一个睡觉的抽象方法,不给出具体的实现
public abstract void sleep();
}
//alt+enter
class Dog5 extends Animal5{
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void sleep() {
System.out.println("狗侧着睡");
}
}
class Cat5 extends Animal5{
@Override
public void eat() {
System.out.println("猫吃🐟");
}
@Override
public void sleep() {
System.out.println("🐱趴着睡");
}
}
public class AbstractTest1 {
public static void main(String[] args) {
//抽象多态创建一个对象
Animal5 a = new Dog5();
a.eat();
a.sleep();
//抽象多态创建第二个对象
Animal5 c = new Cat5();
c.eat();
c.sleep();
}
}
6、老师案例
具体事物:十五期老师,十四期老师
共性:姓名,年龄,讲课。
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 FourteenTeacher extends Teacher{
public FourteenTeacher() {
}
public FourteenTeacher(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教Hive知识");
}
}
class FifteenTeacher extends Teacher{
public FifteenTeacher() {
}
public FifteenTeacher(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教JavaSE");
}
}
public class AbstractTest2 {
public static void main(String[] args) {
//多态创建14期老师对象
Teacher t1 = new FourteenTeacher("阿杰",20);
t1.teach();
//多态创建15期老师对象
Teacher t2 = new FifteenTeacher("阿豪",18);
t2.teach();
}
}
7、学生案例
具体事务:14期学员,15期学员
共性:姓名,年龄,班级,学习,吃饭
abstract class Student2{
private String name;
private int age;
public Student2() {
}
public Student2(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 study();
//吃饭是具体的方法
public void eat(){
System.out.println("吃米饭");
}
}
class FifteenStudent extends Student2{
public FifteenStudent() {
}
public FifteenStudent(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("学习JavaSE");
}
}
class FourteenStudent extends Student2{
public FourteenStudent() {
}
public FourteenStudent(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("学习Hive知识");
}
}
public class AbstractTest3 {
public static void main(String[] args) {
//多态创建第一个对象
Student2 s1 = new FifteenStudent("阿杰",18);
s1.study();
Student2 s2 = new FourteenStudent("阿豪",19);
s2.study();
}
}
8、假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
分析:
普通员工:
成员变量:姓名,工号,工资
成员方法:工作(敲代码)
经理
成员变量:姓名,工号,工资,奖金
成员方法:工作(做PPT)
abstract class Staff{
private String name;
private String id;
private int salary;
public Staff() {
}
public Staff(String name, String id, int salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public abstract void work();
}
class CommonStaff extends Staff{
public CommonStaff() {
}
public CommonStaff(String name, String id, int salary) {
super(name, id, salary);
}
@Override
public void work() {
System.out.println("敲代码");
}
}
class Manager extends Staff{
//特有的属性 奖金
private int bonus;
public Manager(int bonus) {
this.bonus = bonus;
}
public Manager(String name, String id, int salary, int bonus) {
super(name, id, salary);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("做PPT");
}
}
public class AbstractTest4 {
public static void main(String[] args) {
//创建第一个对象
Staff s1 = new CommonStaff("阿杰","KZ0080",100000);
s1.work();
//创建第二个对象
Staff s2 = new Manager("阿豪","SJ00030",200000,1000000);
s2.work();
}
}