面向对象编程支持从已经存在的类中定义新的类,这称为继承。继承使得你可以定义一个通用的类(父类),之后继承该类为一个更特定的类(子类)。
假设需要设计类对三角形或者圆等几何图形建模,几何的对象有许多共同的属性和行为,比如所用的颜色,比如是否填充。
这时就需要用到类的继承,用一个GeometricObject来建模所有的几何对象,以及适用于这些属性的获取方法和设置方法,同时补充三角形(Triangle)所需的属性
GeometricObject类所需要的属性及其方法:
color:String (对象的颜色)
filled:boolean (对象是否填充颜色)
dateCreated:java.util.Date (对象创建的日期)
————————————————————————————————————————————————————————————————————
GeometricObject() (创建一个GeometricObject对象)
GeometricObject(color: String, fled: boolean) (创建特定属性的对象)
getColor: String (返回颜色)
setColor(color: String): void (设置新颜色)
isFilled(): boolean (返回filled属性)
setFilld(filled: boolean): void (设置filled属性)
getDateCreated(): java.util.Date (返回dateCreated)
toString(): String (返回对该对象描述)
Triangle类所需要的属性及其方法:
side1: double
side2: double
side3: double
————————————————————————————————————————————————————————————————————————
Triangle()
Triangle(side1: double, side2: double, side3: double, color: String, flled: booean)
getSide1(): double
getSide2(): double
getSide3(): double
getArea(): double
getPerimeter(): double
toString(): String
使用以下的语法来进行继承
public class Subclass extends Superclass
子类继承了父类, 也将获得父类的全部成员变量和方法
关于继承需要注意的:
1.子类并不是一个父类的子集,通常一个子类比父类包含更多的信息和方法
2.父类中的私有数据与在该类之外是不可访问,因此也不能在子类中直接使用,但如果父类中定义了公共的访问器,那么可以通过这些公共的访问器来访问它们。
3.Java中不允许多重继承,一个Java类只能继承一个父类,这种限制称为单一继承,多重继承可以通过接口实现。
关于super关键字:
关键字super指代父类,可以用于调用父类中的普通方法和构造方法。
//调用父类构造方法的语句是:
super();
super(arguments);
注意:语句super()或super(arguments)必须出现在子类构造方法的第一行,这是显式调用父类构造方法的唯一方式。
关键字super不仅可以引用父类的构造方法,也可以引用父类的方法。
所用语法如下:
super.方法名(参数);
比如
public Triangle(String color,boolean filled){
setColor(color);
setFilled(filled);
}
可替换成
public Triangle(String color,boolean filled){
super(color,filled);
}
方法重写:要重写一个方法,需要在子类中使用和父类一样的签名来对该方法进行定义。
子类从父类中继承方法,有时,子类需要修改父类中定义的方法的实现,这称为方法的重写。
关于方法的重写:
1.重写的方法必须与被重写的方法有一样的签名,一样的或者兼容的返回值类型,兼容的含义是重写方法的返回类型的子类型。
2.仅当实例方法可访问时,他才能被重写,因为私有方法在他所处的类本身以外是不能被访问的,所以它不能被重写,如果子类中的定义的方法在父类中是私有的,则这两个方法完全没有关系。
3.静态方法与实例方法一样,都可以被继承,但是静态方法不能被重写。
比如GeometricObject类中的tostring方法,这个方法可以在Triangle中重写,返回表示三角形的三边长
class GrometriObject{
public String toString(){
return "该图形创造于 "+dateCreated+"\n颜色为: "+color+
" and 填充为: "+filled;
}
}
public class Triangle extends GeometricObject{
public String toString() {
return "Triangle: side1 = "+side1+" side2 = "+side2+" side3 = "+side3;
//返回该三角形的字符串描述
}
}
eg:设计一个名为Triangle的类继承GeometricObject类。该类包括:
1.三个名为side1,side2,side3的double类型数据域表示这个三角形的三条边,他们的默认值是1.0.
2.一个无参构造方法,创建一个默认的三角形。
3.一个创建指定side1,side2,side3的值的三角形的构造方法。
4.所有三个数据域的访问器的方法
5.一个名为getArea()的方法返回该三角形的面积。
6.一个名为getPerimeter()的方法返回该三角形的周长。
7.一个名为toString()的方法返回该三角形的字符串描述。
toString()方法实现如下:
return "Triangle: side1 = “+side1+” side2 = “+side2+” side3 = "+side3;
编写一个程序提示用户输入三条边,颜色,以及一个boolean值提示是否填充。程序需要根据输入一个具有指定边的三角形,并设置color和filled属性,显示面积,周长,颜色以及表明是否填充的真假值。
package java题继承;
import java.util.*; //导入java.util包中的所有类(包括Scanner)
public class Practice {
public static void main(String[] args) {
Scanner input=new Scanner(System.in); //使用Scanner类读取输入
System.out.print("请输入三角形的三条边的长度,三角形的颜色,是否填充"); //提醒用户输入
double side1=input.nextDouble();
double side2=input.nextDouble();
double side3=input.nextDouble();
//通过Scanner类输入三角形的三条边长度
String c=input.next();
//输入颜色
boolean filled=input.nextBoolean();
//输入是否填充
Triangle tri = new Triangle(side1,side2,side3);
//创建新对象
tri.setColor(c);
tri.setFilled(filled);
System.out.println("面积是: "+tri.getArea()+" 周长是: "+tri.getPerimeter()+
"\n颜色是: "+tri.getColor()+" 是否填充: "+tri.isFilled());
}
}
package java题继承;
import java.util.*; //导入java.util包中的所有类(包括Date)
class GeometricObject {
private String color="white";
private boolean filled;
private Date dateCreated;
//设置默认值和对象创建的日期
public GeometricObject() {
dateCreated=new Date();
//创建一个GeometricObject
}
public GeometricObject(String color,boolean filled) {
dateCreated=new Date();
this.color=color;
this.filled=filled;
//创建一个带特定颜色和填充的GeometricObject
}
//用this引用方法中的数据域名字
public String getColor(){
return color;
}
public void setColor(String color){
this.color=color;
}
public boolean isFilled(){
return filled;
}
public void setFilled(boolean filled){
this.filled=filled;
}
public Date getDateCreated(){
return dateCreated;
}
//设置并返回新的颜色,新的filled属性确认是否填充,返回dateCreated
public String toString(){
return "该图形创造于 "+dateCreated+"\n颜色为: "+color+
" and 填充为: "+filled;
}
}
package java题继承;
public class Triangle extends GeometricObject{
private double side1;
private double side2;
private double side3;
public Triangle(){
side1=side2=side3=1;
//默认三条边值为1
}
public Triangle(double s1,double s2,double s3){
super();
//调用父类中已有的方法,设置新的三边边长
side1=s1;
side2=s2;
side3=s3;
}
public double getSide1(){
return side1;
}
public double getSide2(){
return side2;
}
public double getSide3(){
return side3;
}
//返回三条边长
public double getArea() {
double s=(side1+side2+side3)/2;
return Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
}
//返回三角形的面积
public double getPerimeter() {
return side1+side2+side3;
}
//返回三角形的周长
public String toString() {
return "Triangle: side1 = "+side1+" side2 = "+side2+" side3 = "+side3;
//返回该三角形的字符串描述
}
}