不可以通过简单地剪贴源程序来创建新的类。
派生和继承
所谓派生,就是继承已有类的字段和方法,来创建新的类。另外派生时不仅可以继承资产,还可以添加,重写字段和方法。
例如 1
已有的类
class Base {
int a;
int b;
int getA() { /*.....*/}
void setA(int a) { /*.....*/}
int getB() { /*.....*/}
void setB(int b) { /*.....*/}
}
派生的类
class Derived extends Base {
int c;
int getC() { /*.....*/}
void setC(int c) { /*.....*/}
}
另外,派生源的类和通过派生创建的类分别存在以下叫法
*派生源的类 父类/上位类/基类/超类
*派生的类 子类/下位类/派生类
即
对于Derived来说,类Base是父类。
对于类Base来说,类Derived是子类。
例如2 显示二维坐标和三维坐标
class Point2D {
int x; int y; //X ,Y坐标
Point2D(int x,int y) {this.x=x; this.y=y;}
void setX(int x) {this.x=x;} //设置X坐标
void setY(int y) {this.y=y;} //设置Y坐标
int getX() {return x;} // 获取 x坐标
int getY() {return y;} // 获取y坐标
}
class Point3D extends Point2D {
int z; //z坐标
Point3D(int x,int y,int z) { super(x,y); this.z=z;}
void setZ(int z) {this.z=z;} //设置z坐标
int getZ() {return z;} //获取z坐标
}
public class Day01 {
public static void main(String[] args) {
Point2D a=new Point2D(10,15);
Point3D b=new Point3D(20,30,40);
System.out.printf("a=(%d,%d)\n",a.getX(),a.getY());
System.out.printf("b=(%d,%d,%d)",b.getX(),b.getY(),b.getZ());
}
}
*子类在继承父类的资产时,会将其作为自己的一部分。
此外,在类的派生中,构造函数不可以被继承(可以采用super()表达式用于调用父类的构造函数)。
另外,只可以在构造函数的开头调用super(...)
调用super(...)与调用同一个类中其他构造函数this(...)类似。此外,一个构造函数中不可以同时调用super和this。
子类的构造函数中会自动调用父类中的“不接收参数的构造函数”。
Point3D(int x,int y,int z) {this.x=x,this.y=y,this.z=z} //编译错误
像这种不显示调用super(...)的构造函数中,编译器会自动插入父类中“不接收参数的构造函数”的调用,即super()的调用。也就是说上面的构造函数被改写成了下面这样。
Point3D(int x,int y,int z) {super(); this.x=x; this.y=y; this.z=z;} //编译错误
//编译器插入
错误的原因很简单,父类Point2D中不存在“不接收参数的构造函数”,因此无法调用该构造函数。
在不显式调用super(...)的构造函数的开头行中,会自动插入父类中 “不接收参数的构造函数”的调用super()。
如果一个构造函数都没有定义,则会自动定义一个只调用super()的默认构造函数。
例如 3
class A{
private int a;
A () {a=50;}
int getA() {return a;}
}
class B extends A{
//未定义构造函数(创建默认构造函数即 B() {super();})
}
public class DefaultConstructor {
public static void maian(String[] args) {
B x=new B();
System.out.println("x.getA()="+x.getA());
}
}
输出结果为
x.getA()=50
因此,我们知道,虽然父类的构造函数不可以被继承,但“不接收参数的构造函数”可以被间接继承。
此外
当类中未定义构造函数,父类必须持有“不接收参数的构造函数”
A(int x) {a=x;} //类B会发生编译错误
方法的重写和super主体
用来调用父类的构造函数的super主体是该类中包含的父类的部分引用,即存在以下规则
父类的成员(子类)可以通过“super.方法名或者super.变量名”进行访问。
方法重写
顾名思义,重写就是重新写一遍的意思。也就是在子类中把父类本身的方法重新写一遍。子类继承了父类中的某个方法,但却想修改一下为自己所用,这就是重写。
重写的约束条件为
1.方法名
2.参数列表
3.返回类型(子类中方法的返回类型是父类中返回类型的子类)
但是要注意子函数的访问修饰权限不能少于父类 public>protected>default>private
public class Father {
public static void main(String[] args) {
Son i=new Son();
i.
}
public void SayHello() {
System.out.println("HELLO");
}
}
class Son extends Father{
public void SayHello() {
System.out.println("hello boy");
}
}