抽象类
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
抽象类Action:
package oop.demo11;
//abstract 抽象类:本质是类 extends: 类是单继承,没法继承多个类 (但接口可以多继承)
public abstract class Action {
//约束~有人帮我们实现~
//abstract 抽象方法,只有方法的名字,没有方法的实现!
public abstract void doSomething();
//1.不能new这个抽象类,只能靠子类去实现它:约束!
//2.抽象类中可以写普通方法
//3.抽象方法必须在抽象类中
//抽象的抽象:约束
public void hello(){
System.out.println("HelloWorld!");
}
}
//思考题?
/*
1.抽象类既然不能new对象,那么它存在构造器吗?
在out底下找到此抽象类Action.class文件,复制到java底下,打开idea查看有没有构造器。(用idea查看反编译文件)
发现有无参构造,下列为class文件代码
public abstract class Action {
public Action() {
}
public abstract void doSomething();
public void hello() {
System.out.println("HelloWorld!");
}
}
*/
/*
2.抽象类存在的意义是什么?
提高开发效率
*/
继承抽象类的子类A:
package oop.demo11;
/*
抽象类的所有方法,继承了它的子类都必须要实现它的方法,
除非这个子类也是抽象类,那就不用重写方法了,再让子类的子类去实现
*/
public class A extends Action {
@Override
public void doSomething() {
System.out.println("子类重写抽象方法");
}
}
package oop.demo11;
public class Application {
public static void main(String[] args) {
//new Action();//报错提示:'Action' is abstract; cannot be instantiated “Action”是抽象的;不能被实例化
//抽象类不能new,只能new它的子类对象,如果子类还没实现,就要子类的子类了
A a = new A();
a.doSomething();
}
}
思考?
- 1.抽象类既然不能new对象,那么它存在构造器吗?
- 2.抽象类存在的意义是什么?
-
抽象类具体实例:
求矩形和三角形面积,相同点是都有长,宽,三角形的高可以理解为宽,面积是抽象方法,在子类中实现。
抽象类Shape:
public abstract class Shape { //shape:形状 public double length;//长 public double width;//宽 public Shape(double length,double width){ this.length = length; this.width = width; } public abstract double area();//area:面积 }
矩形子类Rectangle:
public class Rectangle extends Shape{ //rectangle:矩形 public Rectangle(double length, double width) { super(length, width); } @Override public double area() { return length*width; } }
三角形子类Triangle:
public class Triangle extends Shape { //triangle:三角形 public Triangle(double length, double width) { super(length, width); } @Override public double area() { return width*length/2; } }
main方法Application类:
public class Application { public static void main(String[] args) { Rectangle rectangle = new Rectangle(5, 3); System.out.println("矩形的面积为:"+ rectangle.area() + "㎡"); Triangle triangle = new Triangle(4, 5); System.out.println("三角形的面积为:"+ triangle.area()+ "㎡"); } }
输出: