/**
* Base.java
* Created by LiuinStein on 2016/5/6.
*/
public class Base {
public int pubA;
private int priB;
protected int proC;
int friD;
public int HidA;
Base() {
pubA = 1;
priB = 2;
proC = 3;
friD = 4;
HidA = 5;
}
Base(int a, int b, int c, int d) {
pubA = a;
priB = b;
proC = c;
friD = d;
}
public int getPriB() {
return priB;
}
protected void ChangeB(int a) {
priB = a;
}
public void SetHidA(int a) {
HidA = a;
}
public int getHidA() {
return HidA;
}
public void fun() {
System.out.println("Base fun load");
}
}
/**
* Derviced.java
* Created by LiuinStein on 2016/5/6.
*/
public final class Derived extends Base { //从Base类中继承
//使用final关键字将类声明为final类,final类不能被继承不能有子类
/**
* 从基类中自然继承了除private成员之外的其他成员
*/
public int A;
private int B;
protected int C;
public double HidA; //在派生类中对基类的HidA进行重写,
//但是还是可以通过基类继承下来的函数对基类HidA进行读写
Derived() {
//
//* 当用子类的构造方法创建一个对象时,子类的构造方法总是先调用
//* 父类的某个构造方法,也就是说子类的构造方法没有明显的指明
//* 使用父类的哪个构造方法,子类就调用父类不带参数的构造方法
//* 也就是说子类的所有成员都会被分配内存空间,虽然private类型
//* 不会被继承,但是也分配了内存空间
//* 如此看来,这好像是浪费了一部分内存,但是其实并不是这样
//* 在子类的继承的父类的方法中,仍然可以操纵那些变量
//
super(1, 2, 3, 4); //使用super关键字调用父类的构造方法
//而且super关键字必需在构造函数的首条
A = -1;
B = -2;
C = -3;
HidA = -4;
//pubA = 4;
//proC = 5;
}
public int getA() {
return pubA;
}
public int getC() {
return proC;
}
public int getD() {
//如果子类与父类不在同一个包中那么像这样的友好成员不能被继承
return friD;
}
final public void fun() {
//方法的重写,必需保持函数的返回值和形参都相同才是重写
//重写只能提升方法的访问权限不能降低访问权限
//注意还使用了final关键字,使用final关键字修饰的方法不能被重写
System.out.println("Derived fun load");
}
public void fun(int x) {
//形参如果不一致的话为重载而不是重写
System.out.println("Derived fun(" + x + ") load");
}
public void supFun() {
System.out.println(super.HidA);
//使用super关键字可以方位基类的隐藏成员
super.fun(); //使用super关键字访问基类的隐藏方法
}
// public int fun(){
// 重写方法的返回值与基类的不一致会产生编译错误
// return 8;
// }
}
/**
* Main.java
* Created by LiuinStein on 2016/5/6.
*/
public class Main {
public static void main(String[] args) {
Derived der = new Derived();
System.out.println("Derived default B " + der.getPriB());
der.ChangeB(100); //在派生类中使用基类的函数仍可以改变private B的值
System.out.println("Derived changed B " + der.getPriB());
System.out.println("Derived HidA: " + der.HidA);
der.SetHidA(15);
System.out.println("Base HidA: " + der.getHidA());
der.fun();
der.fun(5);
der.supFun();
Base derBase = new Derived(); //对象的上转型对象,跟C++的基类指针分配子类内存差不多
//上转型对象不是使用子类的成员变量和成员方法,可以访问子类继承或子类重写的方法
derBase.fun(); //相当于是使用子类重写的fun函数
}
}
首发于我的个人网站:
点击打开链接
转载请注明原文地址: https://ju.6miu.com/read-1299072.html