1.概念
抽象类是被声明为abstract的类-它可能包含也可能不包含抽象方法。抽象类不能被实例化(内部类相关,即不能直接new它本身),但是可以被子类化(也就是可以被继承)。
抽象类定义语法
public abstract class 类名{//定义一个抽象类
}
抽象方法定义语法
访问修饰符 abstract 返回值类型 方法名(参数列表);//知道要做一件事情,但不知道具体怎么去做这件事情
2.抽象类应用场景
一般来说,描述抽象的事物就需要使用抽象类。比如动物、设备、几何图形等。
package com.cyx.abstractclass;
public abstract class Animal {
//抽象方法是没有方法体的。因为方法体就是表示知道具体怎么去做这件事情。
public abstract void eat();
}
package com.cyx.abstractclass;
public class Panda extends Animal{
@Override//不写抽象重写方法的话就要把这个类定义为抽象类
public void eat() {
System.out.println("熊猫吃竹叶");
}
}
package com.cyx.abstractclass;
public class Tiger extends Animal {
@Override
public void eat() {
System.out.println("老虎吃肉");
}
}
package com.cyx.abstractclass;
public class AnimalTest {
public static void main(String[] args) {
Animal a1 = new Panda();
a1.eat();
Animal a2 = new Tiger();
a2.eat();
}
}
如果一个类继承于一个抽象类,那么该类必须实现这个抽象类中的所有抽象方法,否则,该类必须定义抽象类
抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类
设备
package com.hyx.device;
public abstract class Device {
public abstract void work();//知道设备会工作,但不知道设备怎么工作
}
package com.hyx.device;
public class TV extends Device{
@Override
public void work() {
System.out.println("电视机播放电视剧0");
}
}
package com.hyx.device;
public class ElectronicFan extends Device {
@Override
public void work() {
System.out.println("电风扇开始转起来了");
}
}
package com.hyx.device;
public class DeviceTest {
public static void main(String[] args) {
Device d1 = new TV();
d1.work();
Device d2 = new ElectronicFan();
d2.work();
}
}
几何图形
package com.cyx.shape;
public abstract class Shape {
public abstract Number perimeter();//知道几何图形能算周长,但不知道怎么算
public abstract Number area();//知道几何图形能算面积,但不知道怎么算
}
package com.cyx.shape;
public class Rectangle extends Shape{
private int width;
private int length;
public Rectangle(int width, int length) {
this.width = width;
this.length = length;
}
@Override
public Integer perimeter() { //本来是public Number perimeter 把Number改为Integer就是协变返回值类型 这个返回值类型是父类返回值的子类
return (length + width) * 2;
}
@Override
public Integer area() {
return length * width;
}
}
package com.cyx.shape;
public class Circle extends Shape {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
@Override
public Double perimeter() {//也是使用协变返回类型
return 2 * Math.PI * radius;
}
@Override
public Double area() {
return Math.PI * radius * radius;
}
}
package com.cyx.shape;
public class ShapeTest {
public static void main(String[] args) {
Shape s1 = new Rectangle(10,8);
System.out.println(s1.area());
System.out.println(s1.perimeter());
Shape s2 = new Circle(10);
System.out.println(s2.perimeter());
System.out.println(s2.area());
}
}