不可以通过简单地剪贴源程序来创建新的类。

派生继承

所谓派生,就是继承已有类的字段和方法,来创建新的类。另外派生时不仅可以继承资产,还可以添加重写字段和方法。

例如 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");
    }
}