java继承问题

package test;

public class test extends text{
	public static void main(String[] args) {
		System.out.println(new test().geta());//无法通过new test().a直接访问父类的a。因为a为父类私有属性
	}//即子类无法通过继承得到父类的私有属性(私有变量和私有方法)
}
class text {
private int a=3;
protected int geta() {
	return this.a;//父类对子类公开的方法中影响了自己的私有属性a,子类继承后可以通过该方法对
	//a进行操作
}
}
//总结→→
//A subclass does not inherit the private members of its parent class. 
//However, if the superclass has public or protected methods for accessing its private fields, 
//these can also be used by the subclass.
//子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
public class test extends text{
	public static void main(String[] args) {
		text b=new test();
		System.out.println(b.a);//输出3
		System.out.println(new test1().a);//输出3
		b.a++;//对b.geta()的输出有影响,但对父类的a无影响
		System.out.println(b.geta());//输出5,b.geta()操作的也是一个镜像,对父类的a无影响
		System.out.println(new test1().a);//输出3
		System.out.println(b.a);//输出5
	}//结论:每个子类对象获取父类的实例属性(变量和方法)只是一个镜像,对父类属性进行的任何操作都不会影响父类本身
}
class test1 extends text{
	
}
class text {
int a=3;//实例变量(非静态)
protected int geta() {
	this.a++;
	return this.a;
	
}
}
public class test extends text{
	public static void main(String[] args) {
		
		System.out.println(test.a);//输出3
		System.out.println(test1.a);//输出3
		test.a++;//该操作对父类的a有影响,因为a是父类的静态属性
		System.out.println(new test().geta());//输出5
		System.out.println(test1.a);//输出5
		System.out.println(new test1().geta());//输出6
		System.out.println(test.a);//输出6
	}//结论:由于a是父类的静态属性,是属于(父)类本身,所以每一个子类对其的任何操作都会影响到a的值
}
class test1 extends text{
	
}
class text {
static int a=3;
protected int geta() {
	a++;
	return a;
	
}
}

综合2,3图,如果想要子类自身的任何操作对父类的属性无影响且子类与子类之间互不干涉,则应该把父类的属性定义成非静态类型

我们再往下引申一下,我们都知道接口(interface)是抽象类的一种升华。实现接口的类也会获得该接口的成员变量和默认方法(私有方法获取不了,因为该方法是用private封装起来的)。同时我们知道接口里面的所有成员变量都是被强制用public static final修饰的。可这是为什么呢?public很简单,因为接口是属于公共的,是要被其它类实现的,所以要用public修饰。但为什么static final要一起用呢?在这里我们或许可以得到一个较为满意的答案:接口没有构造器和初始化块所以定义成员变量时就要进行赋值,用static修饰意味着接口里面的所有变量都是属于接口本身的,可以直接通过-接口名.变量名-的形式调用。用final修饰意味着该成员变量不可更改,在上面的测验中,我们知道当父类的一个变量为静态时,子类们对这个变量的任何操作都会对父类这个变量产生作用(变量值发生变化),从而导致每个子类继承到的这个父类属性并不是理性准确的值。同样我们将这个结论应用到接口里来(实现接口在某种意义上来说也是一种特殊的继承父类),为了消除这种现象,于是就将接口里的成员变量用final修饰,该成员变量只可被引用而不可被更改。

 

 

你可能感兴趣的:(java,开发语言)