1.abstract关键字的使用
- abstract:抽象的
- abstract可以用来修饰的结构:类、方法
- abstract修饰类:抽象类
3.1 此类不能实例化
3.2抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
3.3开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作 - abstract修饰方法:抽象方法
4.1 抽象方法只有方法的声明,没有方法体
4.2 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
4.3若子类重写了父类中的所有的抽象方法后,此子类方可实例化
4.4若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰 - abstract使用上的注意点:
5.1 abstract不能用来修饰:属性、构造器等结构
5.2 abstract不能用来修饰私有方法、静态方法、final的方法、final的类
举例:
abstract class GeometricObject{
public abstract double findArea();
}
class Circle extends GeometricObject{
private double radius;
public double findArea(){
return 3.14 * radius * radius;
};
}
1.1AbstractTest.java类代码
package com.my.java;
public class AbstractTest {
public static void main(String[] args) {
//一旦Person类抽象了,就不可实例化
// Person p1 = new Person();
// p1.eat();
}
}
abstract class Creature{
public abstract void breath();
}
abstract class Person extends Creature{
String name;
int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//不是抽象方法:
// public void eat(){
//
// }
//抽象方法
public abstract void eat();
public void walk(){
System.out.println("人走路");
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
public Student(){
}
public void eat(){
System.out.println("学生多吃有营养的食物");
}
@Override
public void breath() {
System.out.println("学生应该呼吸新鲜的没有雾霾的空气");
}
}
2.抽象类的匿名子类
package com.my.java;
public class PersonTest {
public static void main(String[] args) {
method(new Student());//匿名对象
Worker worker = new Worker();
method1(worker);//非匿名的类非匿名的对象
method1(new Worker());//非匿名的类匿名的对象
System.out.println("********************");
//创建了一匿名子类的对象:p
Person p = new Person(){
@Override
public void eat() {
System.out.println("吃红烧肉");
}
@Override
public void breath() {
System.out.println("吸氧");
}
};
method1(p);
System.out.println("********************");
//创建匿名子类的匿名对象
method1(new Person(){
@Override
public void eat() {
System.out.println("吃螺蛳粉");
}
@Override
public void breath() {
System.out.println("螺蛳粉的臭味");
}
});
}
public static void method1(Person p){
p.eat();
p.breath();
}
public static void method(Student s){
}
}
class Worker extends Person{
@Override
public void eat() {
}
@Override
public void breath() {
}
}
3.抽象类的应用:模板方法的设计模式
package com.my.java;
public class TemplateMethodTest {
public static void main(String[] args) {
BankTemplateMethod btm = new DrawMoney();
btm.process();
BankTemplateMethod btm2 = new ManageMoney();
btm2.process();
}
}
abstract class BankTemplateMethod {
// 具体方法
public void takeNumber() {
System.out.println("取号排队");
}
public abstract void transact(); // 办理具体的业务 //钩子方法
public void evaluate() {
System.out.println("反馈评分");
}
// 模板方法,把基本操作组合到一起,子类一般不能重写
public final void process() {
this.takeNumber();
this.transact();// 像个钩子,具体执行时,挂哪个子类,就执行哪个子类的实现代码
this.evaluate();
}
}
class DrawMoney extends BankTemplateMethod {
public void transact() {
System.out.println("我要存款200RMB");
}
}
class ManageMoney extends BankTemplateMethod {
public void transact() {
System.out.println("我要理财!我这里有2000万RMB!!");
}
}