Java继承、隐藏、重写

本文深入探讨Java中的继承概念,包括成员变量的继承、隐藏与重写,以及私有变量的处理方式。通过具体代码示例,解释了子类如何继承父类的公共变量,私有变量的行为,以及如何正确使用super关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看继承这一块时对一部分东西感到混乱,所以写了个test代码,记录如下。

package fatherandson;

public class Father {
	public int a;				//被重写
	public int b;				//被继承
	private int c;				//不被子类继承


	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}
	
	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}
	
	public int getC() {
		return c;
	}

	public void setC(int c) {
		this.c = c;
	}
	
	Father(){		
	}
	
	Father(int a,int b,int c){
		this.a=a;
		this.b=b;
		this.c=c;
	}
	
}
package fatherandson;

public class SonA extends Father{
	public int a;

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}
	
	public void func(){
		super.a=5;	
	}
	
	public void g() {
		System.out.println("SonA:super.a="+super.a);
	}
}
package fatherandson;

public class SonB extends Father{
	public int a;

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}
	
	public void func(){
		super.a=10;
	}
	
	public void g() {
		System.out.println("SonA:super.a="+super.a);
	}
}

       

package fatherandson;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
				SonA sona=new SonA();
				
				SonB sonb=new SonB();
				
				sona.a=10;
				sonb.a=20;
				//System.out.println();
				System.out.println("sona.a="+sona.a);
				System.out.println("sonb.a="+sonb.a);
			    
				//关于隐藏的变量
				System.out.println("---------------------------------------");
		    	System.out.println("关于隐藏的变量");
			    sona.func();
			    sona.g();
			    sonb.func();
			    sonb.g();
			    sona.g();
			    
			    //关于继承的变量
			    System.out.println("---------------------------------------");
			    System.out.println("关于继承的变量");
			    sona.b=10;
			    sonb.b=20;
			    System.out.println("sona.b="+sona.b);
			    System.out.println("sonb.b="+sonb.b);
			    
			    //关于未继承的私有变量
			    System.out.println("---------------------------------------");
			    System.out.println("关于未继承的变量");
			    sona.setC(10);
			    sonb.setC(20);
			    System.out.println("sona调用继承方法操作c:"+sona.getC());
			    System.out.println("sonb调用继承方法操作c:"+sonb.getC());
	}

}

       run

       关于不被继承的变量(如上面的private变量c), 课本是这么描述的:

       当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配内存,而且父类的成员变量也都分配了内存空间,但只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量。

      父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,当然他们也不是父类某个对象的变量,因为我们根本就没有使用父类创建对象,只有从父类继承的一部分方法可以操作这部分未继承的变量。

            上述话听起来像是父类把已分配内存的能继承的变量给了子类的对象,不被继承的属于父类,那当我再创建一个对象时,这些子类的未继承变量是相同的都属于父类的变量(一个对象操作未继承的变量,另一个对象输出那个变量的值也变了)。我原以为这部分未继承的变量属于父类这样,但其实不是,从运行结果可以看出每个子类对象通过继承的方法操作的未继承变量都是无关的。所以应该是每个子类对象初始化时都分别与父类分配内存的变量建立了一种关系,这些子类对象之间互相无关。

 

       什么叫继承呢?所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作,也就是说,一个子类继承的成员应当是这个类的完全意义的成员,如果子类中定义的实例方法不能操作父类的某个成员变量,该成员变量就没有被子类继承。所谓子类继承父类的方法作为子类中的一个方法,就像是它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。

      当使用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。这样子类创建对象时,父类的成员变量也被分配了内存空间。

           我不知道是父类分配内存的变量分配给子类对象,还是子类先继承有哪些变量然后子类对象因为是子类实例而有哪些变量,但可以知道的是继承的变量就当是在子类中声明的一样,隐藏的归关键字super拥有,重写的也是在子类中声明的一样,父类中未继承的变量每个子类对象的情况都不一样。(原因即红字部分)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值