目录
一、抽象类引出
二、抽象类的介绍
三、抽象类的细节
第一条
第二点
第三点
第四点
第五点
第六点
第七点
第八点
四、练习
第一题
第二题
一、抽象类引出
当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract 来修饰该类就是抽象类。
package com.hspedu.abstract_;
public class Abstract01 {
public static void main(String[] args) {
}
}
abstract class Animal{
private String name;
public Animal(String name) {
this.name = name;
}
//这里的eat()实现了也没有什么意义
//问题:父类方法不确定性
//1.考虑将该方法设计为抽象方法
//2.所谓抽象方法就是没有实现的方法
//3.所谓没有实现就是没有方法体
//4.当一个类中存在abstract方法时,必须将该类声明为abstract类
//5.一般来说,抽象类会被继承,由其子类来实现抽象方法
// public void eat(){
// System.out.println("不知道动物吃什么~");
// }
public abstract void eat();
}
二、抽象类的介绍
1)用abstract 关键字来修饰一个类时,这个类就叫抽象类
访问修饰符 abstract 类名{
}
2)用abstract 关键字来修饰一个方法时,这个方法就是抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表); //没有方法体
public abstract void eat();
3)抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类
4)抽象类,是考官比较爱问的知识点,在框架和设计模式使用较多
三、抽象类的细节
第一条
抽象类不能被实例化
package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
new A();
}
}
abstract class A{
}
报错:'A' is abstract; cannot be instantiated
第二点
抽象类不一定要包含abstract方法。也就是说抽象类可以没有abstract方法
package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
}
}
abstract class A{
public void hi(){
System.out.println("hi");
}
}
第三点
一旦类包含了abstract方法,则这个类必须声明为abstract
package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
}
}
class B {
public abstract void eat();
}
报错
需要将class B改成abstract class B
package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
}
}
abstract class B {
public abstract void eat();
}
第四点
abstract 只能修饰类和方法,不能修饰属性和其它的。
package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
}
}
//abstract 只能修饰类和方法, 不能修饰属性和其它的
class C {
public abstract int n1;
}
第五点
抽象类可以有任意成员[抽象类本质还是类],比如: 非抽象方法、构造器、静态属性等等
package com.hspedu.abstract_;
public class AbstractDetail02 {
public static void main(String[] args) {
}
}
//5) 抽象类可以有任意成员[抽象类本质还是类],比如: 非抽象方法、构造器、静态属性等等
abstract class A01{
public int age;
public static String name;
public A01(int age) {
this.age = age;
}
public void hi(){
System.out.println("hi");
}
public abstract void hello();
public static void cry(){
System.out.println("cry");
}
}
第六点
抽象方法不能有主体,即不能实现
第七点
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。
abstract class B01{
public abstract void f1();
}
class C01 extends B01 {
@Override
public void f1() {
}
}
abstract class B01{
public abstract void f1();
}
abstract class C01 extends B01 {
}
第八点
抽象方法不能使用private、final 和 static来修饰,因为这些关键字都是和重写相违背的(抽象方法就是为了在子类实现重写而设计的)
修饰符的非法组合:“abstract”和“private”
abstract class D01{
//静态方法可以直接用类名.方法名调用,所以必须有方法体
//而抽象方法必须没有方法体,两者不能兼容
//public static abstract void f2();
//出现以下两种情况时,子类不能重写该方法,与抽象方法的初衷相违背
//public final abstract void f2();
//private abstract void f2();
}
四、练习
第一题
抽象方法不能使用private、final 和 static来修饰
第二题
package com.hspedu.abstract_;
// 编写一个Employee类,声明为抽象类,包含如下三个属性:
// name,id,salary.提供必要的构造器和抽象方法: work(。
// 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。
// 请使用继承的思想,设计CommonEmployee类和Manager类,
// 要求类中提供必要的方法进行属性访问,实现work0,提示“经理/普通员工 名字 工作中....
abstract class Employee{
private String name;
private String id;
private double salary;
public Employee(String name, String id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public abstract void work();
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
package com.hspedu.abstract_;
public class Manager extends Employee{
private double bonus;
public Manager(String name, String id, double salary) {
super(name, id, salary);
}
@Override
public void work() {
//“经理/普通员工 名字 工作中
System.out.println("经理" + getName() + "工作中");
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
灵活设计bonus金额,没有在构造器中初始化
package com.hspedu.abstract_;
public class CommonEmployee extends Employee{
public CommonEmployee(String name, String id, double salary) {
super(name, id, salary);
}
@Override
public void work() {
System.out.println("普通员工" + getName() + "工作中");
}
}
package com.hspedu.abstract_;
public class AbstractExercise02 {
public static void main(String[] args) {
Manager john = new Manager("john", "20230117", 8000);
john.setBonus(30000);
john.work();
CommonEmployee mary = new CommonEmployee("mary", "20130117", 6000);
mary.work();
}
}