abstract关键字
- 表示抽象
- 抽象方法:方法中有abstract关键字,并且方法体中没有具体实现
抽象方法的格式:修饰词 abstract 类型 方法名(); - 抽象类:含有抽象方法的类
抽象类的格式:修饰词 abstract class 类名{ } - 应用方式:父类的抽象方法,子类需要重写,重写过程就是对抽象方法进行具体化
代码演示:抽象方法与抽象类的应用
-
抽象类是不能进行实例化(Animal是个抽象类,不能通过Animal类创建对象)
-
抽象类必须至少有一个子类进行继承(Pig类 继承 Animal抽象类)
-
抽象类中出现多个抽象方法,子类一定要对每个抽象方法进行重写。如果不写,否则子类报错,提示重写抽象方法(Animal类中有吃、睡两个方法都要在Pig类中进行重写)
-
抽象类是有构造方法的,目的是供子类创建对象时,初始化父类的属性(子类构造器中,有默认的super(), 访问父类的构造方法)
-
抽象类不一定包含抽象方法,但包含抽象方法的类是抽象类
-
抽象方法在抽象类中可写可不写
public class AnimalDemo {
public static void main(String[] args) {
Animal animal = new Pig();
animal.eat();
animal.sleep();
}
}
// 抽象类
abstract class Animal {
Animal(){
System.out.println("这是抽象类的构造方法!!");
}
public abstract void eat();
public abstract void sleep();
}
// 子类继承抽象类
class Pig extends Animal{
Pig(){
System.out.println("这是子类的构造方法!!");
}
@Override
public void eat() {
System.out.println("猪在吃饭!");
}
@Override
public void sleep() {
System.out.println("猪在睡觉!");
}
}
小练习
抽象类与抽象方法的应用:用户输入各种图形的数据,计算面积及周长
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入矩形的长:");
int num1 = scanner.nextInt();
System.out.print("请输入矩形的宽:");
int num2 = scanner.nextInt();
Shape rectangle = new Rectangle(num1,num2);
System.out.println("矩形的面积是" + rectangle.area());
System.out.println("矩形的周长是" + rectangle.perimeter());
System.out.print("请输入圆的半径:");
int r = scanner.nextInt();
Shape circle = new Circle(r);
System.out.println("面积:"+circle.area());
System.out.println("周长:"+circle.perimeter());
}
}
abstract class Shape {
public abstract double area();
public abstract double perimeter();
}
class Rectangle extends Shape{
int num1,num2;
public Rectangle(int num1 ,int num2) {
this.num1 = num1;
this.num2 = num2;
}
@Override
public double area() {
return num1*num2;
}
@Override
public double perimeter() {
return 2*(num1+num2);
}
}
class Circle extends Shape {
int r;
public Circle(int r){
this.r = r;
}
@Override
public double area() {
return r*r*3.14;
}
@Override
public double perimeter() {
return r * 2 * 3.14;
}
}