Java 抽象类和抽象方法
- 抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。
- 使用抽象类可以充分利用这些公共属性来提高开发和维护程序的效率。
- 抽象方法必须为public或protected。(因为如果是private,则不能被子类继承,子类无法实现该方法)抽象方法没有方法体。
- 抽象类和抽象方法用abstract修饰。
- 子类如果不是抽象类,则必须重写抽象类中的全部抽象方法。如果子类没有实现父类的抽象方法,必须将子类也定义成抽象类。
- 抽象类不能用final关键字声明,因为抽象类必须有子类,但是final定义的类不能有子类。
- 抽象类不能直接实例化,需要依靠子类向上转型的方式实例化。
public abstract class Animal {//抽象类Animal要用abstract关键字声明。public abstract void shout();//抽象方法没有方法体,用abstract修饰。
}
public class Dog extends Animal {//子类继承抽象类public void shout() {//Dog子类不是抽象类,必须重写抽象类中全部抽象方法。System.out.println("汪汪汪");}
}
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubAnimal a1 = new Dog();//抽象类不能直接实例化,需要依靠子类向上转型的方式实例化。Animal a1 = new Animal()报错a1.shout();//a1拥有了Dog类重写的shout方法。}
}
抽象类和普通类的区别:
- 抽象类比普通类多了一些抽象方法,其他组成部分和普通类完全一样。
- 普通类对象可以直接实例化,抽象类对象必须向上转型之后才可实例化。
- 子类继承抽象类,子类需要重写方法。但是子类继承普通类,子类可以有选择地决定是否需要重写方法。
//抽象类实例:
public abstract class Shapes {public abstract double getArea();public abstract double getPerimeter();
}
public class Circle extends Shapes {double r;public Circle(double r) {//构造函数this.r = r;}public double getArea() {return r*r*Math.PI;}public double getPerimeter() {return 2*Math.PI*r;}
}
public class Square extends Shapes{int width;int height;public Square(int width, int height) {//构造函数this.width = width;this.height = height;}public double getArea() {return width*height;}public double getPerimeter() {return 2*(width + height);}
}
public class Test {public static void main(String args[]) {Circle c1 = new Circle(1.0);System.out.println("圆形面积为 " + c1.getArea());System.out.println("圆形z周长为 " + c1.getPerimeter());Square s1 = new Square(1,1);System.out.println("正方形面积为 " + s1.getArea());System.out.println("正方形周长为 " + s1.getPerimeter());}
}
/*
圆形面积为 3.141592653589793
圆形z周长为 6.283185307179586
正方形面积为 1.0
正方形周长为 4.0
*/