**
继承的用法及意义
**
OOP中两个类常有的关系有两种:
1.组合关系:满足a part of… 一部分 一个类定义的对象称为另一个类的成员变量 has a…的关系
A类是B类的一部分,A和B就设计成组合关系,设计如下:
class A{}
class B{
A a; // B组合了A对象
public B{
this.a = new A():
}
}
2.继承关系:满足 a kind of… 一种的关系 用extends继承 is a…的关系 A是一个已经定义的类,B是A的一种,那么设计成继承关系,如下:
class A{}
class B extends A {
}
继承的意义之一:代码的复用
this关键字的两种用法:
1.在构造函数中调用如 this(10),调用待int参数的其它的构造函数
2.在成员方法里面访问其它成员,前面可以添加this.
super关键字的三个用法:
1.在派生类的构造函数中,调用super(10),调用基类的带int参数的构造函数
2.super.func() 在派生类中,调用从基类继承来的func方法
3.super.a 在派生类中,调用从基类继承来的名字叫a的成员变量
this和super关键字都和对象有关,所以在static方法中不能使用这两个关键字
private和protected的区别?
1.它们两个修饰的成员,在类的外部都不能访问
2.基类的private成员,在派生类中无法访问;基类的protected成员,在派生类中可以访问
继承方法的具体实现
B b1 = new B();
B b2 = new B(); //静态块初始化属于类级别初始化,每次打印只初始化一次
b1.test();
}
}
class A{
protected int a;
static{
System.out.println("A static block init.");
}
{
System.out.println("A instance block init.");
}
public A(){
System.out.println("A()");
this.a = 0;
}
public A(int a){
System.out.println("A(int)");
this.a = a;
}
public void show(){
System.out.println("A.show a:" + a);
}
}
/**
* 派生类B有两部分
* 1.从基类继承来的成员
* 2.自己定义的成员
*
* super和this都必须写在第一行
*/
class B extends A{
private int b;
private int a;
static{
System.out.println("B static block init.");
}
{
System.out.println("B instance block init.");
}
public B(){
// 如何在派生类中调用基类的构造函数呢? super方法调用!!
super(); // A() a = 0
System.out.println("B()");
}
public B(int data){
super(data); // A(int) a = data
System.out.println("B(int)");
}
public void show(){ // 作用域不同 show A.show a A.a
System.out.println("B.show a:" + super.a);
}
void test(){ // 测试方法
// 在派生类中,调用基类的方法
super.show();
}
打印结果: