static方法不能直接访问类内的非static变量和不能调用this,super语句分析
大家都知道在static方法中,不能访问类内非static成员变量和方法。可是原因是什么呢?
这首先要从static方法的特性说起。static方法,即类的静态成员经常被称为“成员变量”(class members),对于静态成员变量,我们叫类属性(class attributes),对于静态成员方法,我们叫类方法(class members)。其中静态成员变量:无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。我们可以直接使用类名来访问这个static变量,还可以在类的非静态的成员方法中像访问其他非静态成员变量一样去访问这个静态成员变量。对于静态方法,该方法不必和对象绑在一起。访问方式有三种,类内:非静态成员方法可以直接访问静态成员方法,类外:类名.成员 对象.成员
从以上我们就可以知道,静态成员的最大特点是不用和对象绑定在一起。这个方便的特性,也成了它的一个包袱:当在静态成员的类外时,如果是直接用类名.静态成员的方式访问,静态成员直接访问了一个非静态的成员(该被访问成员一般是类内的,如果是类外的,可能就先创建对象了,因为不能直接访问,这里的直接访问与访问权限没有概念上的关系,访问权限是设定了访问的范围,直接访问则是一种访问方式)。这个时候就出现一个问题,非静态的成员是怎么访问的?如果可以直接访问,难道它也是可以脱离对象的吗?(静态成员的访问是脱离了对象的,而静态成员又直接访问了非静态成员)答案显然是否定的。所以在静态方法中不可以直接访问类内的非静态成员,如果要访问非静态成员,则要先创建对象。
也许会有这样的疑问:既然是出在了非静态成员身上,那么可不可以用对象.static方法直接访问类内的成员?这个样子的实质还是直接访问了非静态成员,并不是说用了对象.static方法访问就可以改变静态方法访问类内成员的方式.还有一个疑问就是,super指针的使用.(意思是调用父类被覆盖的方法)
例子:
class Person{
String name;
String name;
int age;
static void getInfo(){
System.out.println("base class");
}
}
class Student extends Person
{
String school=new String();
public static void getInfo()
{
super.getInfo();
System.out.println("子类");
static void getInfo(){
System.out.println("base class");
}
}
class Student extends Person
{
String school=new String();
public static void getInfo()
{
super.getInfo();
System.out.println("子类");
}
public static void main(String args[])
{
getInfo();
}
}
}
看起来,这个例子中的
public static void getInfo()
{
super.getInfo();
System.out.println("子类");
{
super.getInfo();
System.out.println("子类");
}
super.getInfo();语句是个静态的方法,可以直接调用,但是这里的调用方式却是错误的,用到了super指针.如果是直接调用,没有对象的话,指针从哪里来的?所以这个疑问也是可以打消的.
记住课本上的三条规则.还有就是main()中也是不可以使用this及super指针的.
以后的所有设想都要用代码来表示,不然越说越模糊.
穿越牛熊的“巴菲特”投资系统(发布于05-27 11:02)
巴菲特的“安全边际”(发布于2019-6-16 10:39)
安全边际:成功的基石(附选股)(选股策略系列五完结篇)(发布于06-14 11:11)
分红与成长性:投资回报的体现(选股策略系列四)(发布于06-13 13:35)
合理的资本结构:企业的生命线(选股策略系列2)(发布于06-11 12:44)
稳定的每股利润:价值的基础(选股策略系列三)(发布于06-12 09:57)
股票与债券的对比投资(发布于06-09 10:13)
二类股值得投资吗?(选股策略系列一)(发布于06-10 15:51)
透视伯克希尔投资组合---看巴菲特与格雷厄姆(发布于06-07 09:43)