类的继承格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
...
}
class 子类 extends 父类 {
...
}
继承的特性
- 子类拥有父类非private的属性和方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法,即重写父类的方法。
- Java的继承是单继承,但是可以多重继承。单继承就是一个子类只能继承一个父类;多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是Java继承区别于C++继承的一个特性。
访问控制的继承
请注意以下方法继承的规则:
- 父类中声明为 public 的方法在子类中也必须为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
final关键字
final 关键字声明类可以把类定义为不能被继承,即“最终”的类;如果用于修饰方法,则该方法不能被子类重写。
注:实例变量也可以被定义为 final 类型,被定义为 final 类型的变量不能被修改。被声明为 final 的类的方法会被自动声明为 final 类型,但是其实例变量并不是 final 类型。
抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
在Java语言中使用 abstract 关键字来定义抽象类。切记,抽象类不能实例化对象,只能先定义一个非抽象子类继承该抽象类,再通过这个子类实例化对象。
public abstract class ClassName {
...
}
抽象方法
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
public abstract class ClassName {
public abstract returnType methodName();
}
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
package step1;
import java.util.Scanner;
public class ShapeTrouble {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double radius = scanner.nextDouble();
double length = scanner.nextDouble();
double width = scanner.nextDouble();
Circle circle = new Circle(radius);
Rectangle rectangle = new Rectangle(length, width);
System.out.println(circle.getAcreage());
System.out.print(rectangle.getAcreage());
}
}
/********** Begin *********/
abstract class Shape {
abstract double getAcreage();
}
class Circle extends Shape {
private double radius;
public double PI = 3.1415926;
public Circle(double radius) {
this.radius = radius;
}
public double getAcreage() {
return PI * radius * radius;
}
}
class Rectangle extends Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getAcreage() {
return length * width;
}
}
/********** End *********/
搞不懂我自己的为什么错,结果和上面不同
package step1;
import java.util.Scanner;
public class ShapeTrouble {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double radius = scanner.nextDouble();
double length = scanner.nextDouble();
double width = scanner.nextDouble();
Circle circle = new Circle(radius);
Rectangle rectangle = new Rectangle(length, width);
System.out.println(circle.getAcreage());
System.out.print(rectangle.getAcreage());
}
}
/********** Begin *********/
abstract class Shape {
public abstract double getAcreage();
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getAcreage() {
final double PI = 3.1415926;
return Math.PI * radius * radius;
}
}
class Rectangle extends Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getAcreage() {
return length * width;
}
}
/********** End *********/