个人技术分享

抽象类及抽象方法

概念:一个类中没有包含足够的信息来描绘一个具体的对象,这种类被定义为抽象类,含有抽象方法的类也被称为抽象类。

用通俗的话来说就是当一个类的某个功能(方法)实现不确定时,我们就将该功能(方法)用abstract修饰,让其变为抽象方法,这个方法所在的类就称为抽象类,我们让某个类来继承这个抽象类,称为该抽象类的子类,让这个子类来具体实现这个方法。当然,这个子类可以不实现这个抽象方法,但是这个子类也要成为一个抽象类。

抽象方法的声明

语法格式:[访问权限修饰符] abstract 返回值类型 方法名(参数列表) [throws 异常列表];

public abstract void eat();

注意

  • 抽象方法不能被private,final,static修饰。
  • 抽象方法不能有方法体。

抽象类的声明

语法格式:[权限修饰符] abstract class 类名{ }

public abstract class Test{}

注意

  • 抽象类中可以包含五种成分,成员变量,方法,初始化块,构造器,内部类。
  • 抽象类中不一定要有抽象方法。

抽象类的局限性

  • 抽象类有时候会出现代码冗余的问题
  • 类的继承是单根继承,一个类只能直接继承一个类。

代码实现:

abstract class Animal {
    String name;
    int age;
    public abstract void eat(); 
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("小猫吃鱼");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("小狗啃骨头");
    }
}
public class Test01 {
    public static void main(String[] args) {
   		Cat cat = new Cat();
        cat.eat();//输出小猫吃鱼
        Dog dog = new Dog();
        dog.eat();//输出小狗啃骨头
    }
}

注意抽象类不能创建对象!

public abstract class Person {
	public abstract void eat();
}

测试类:

public class Test02 {
	public static void main(String[] args) {
		Person person = new Person() {
			@Override
			public void eat() {
				System.out.println("印度人喜欢吃咖喱");
			}
		};
		person.eat();//输出:印度人喜欢吃咖喱
	}
}

代码分析:

  1. 底层创建匿名类,继承Person类,重写eat()
  2. 创建匿名类的对象
  3. 将匿名类对象的内存地址赋值给父类的引用

内存分析:

在这里插入图片描述

总结

  1. 抽象类中只能有抽象方法?
    抽象类中可以有构造方法、静态方法、成员方法、抽象方法
  2. 抽象类中不可以没有抽象方法?
    可以,但是毫无意义
  3. 如果父类是抽象类,则子类必须实现父类的抽象方法?
    不一定,子类如果是抽象类,可以不实现父类的抽象方法
  4. 抽象类不能有构造方法?
    可以有
  5. 可以使用new关键字来创建抽象类对象?
    不能,创建的是匿名内部类的对象