Java 中继承之后同名静态变量的问题分析

看下面几种情况的代码:

  • 第一种:

class A{

public static int na; // A中定义静态成员变量

 

}

 

class B extends A{ // B继承A,并且B中没有同名的变量

}

 

A.na = 3;

System.out.println(B.na); // 3

B b = new B();

b.na ++;

System.out.println(B.na); // 4

 

继承之后可以继承父类的静态成员变量。并且A.na \ a.na \ B.na \ b.na 代表的是同一个变量

  • 第二种:

class A{

public static int na;  // A中定义静态成员变量

 

}

 

class B extends A{

public int na;  // B继承A之后,又自己定义同名的普通成员变量

}

A.na = 3;

A a = new A();

a.na++;

 

System.out.println(A.na); // 4

B b = new B();

 

System.out.println(b.na); // 4

由上面的代码可以看出,在B中,普通的成员变量na覆盖了从A中继承来的静态成员变量,要使用A中的静态成员na 只有用A.na 或者a.na两种方式,而B.na 编译器会认为是错误的,b.na表示的是B中的普通成员变量。

  • 第三种

class A{

public static int na ;// A中定义静态成员变量

 

}

 

class B extends A{

public static int na; // B继承A之后又定义了自己的同名静态成员变量。

}

A.na = 3;

A a = new A();

a.na++;

System.out.println(A.na); // 4

B b = new B();

B.na = 10;

b.na++;

System.out.println(B.na); // 11

System.out.println(A.na); // 4

从上面的输出结果可以看出,B中的静态成员na会覆盖A中的静态成员,此时,AB拥有完全不同的静态成员na

 

 

总结:从上面的三种情况可以看出,静态变量既可以被子类继承,但继承之后,多个类共用的还是一个变量空间。还可以被子类覆盖。所以如果我们在使用的时候就需要特别注意这种情况。

为了规范代码,避免错误,关于静态成员,我们统一用类名的方式进行调用,并且,它是在哪个类中定义的就使用哪个类进行调用。完全把它当做全局函数使用。虽然这在一定程度上有违面向对象的观点,但它对于程序的正确运行、扩展有很大的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值