static方法不能直接访问类内的非static变量和不能调用this
2010-02-15 12:09
246 查看
static方法不能直接访问类内的非static变量和不能调用this,super语句分析
大家都知道在static方法中,不能访问类内非static成员变量和方法。可是原因是什么呢?
这首先要从static方法的特性说起。static方法,即类的静态成员经常被称为“成员变量”(class members),对于静态成员变量,我们叫类属性(class attributes),对于静态成员方法,我们叫类方法(class members)。其中静态成员变量:无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。我们可以直接使用类名来访问这个static变量,还可以在类的非静态的成员方法中像访问其他非静态成员变量一样去访问这个静态成员变量。对于静态方法,该方法不必和对象绑在一起。访问方式有三种,类内:非静态成员方法可以直接访问静态成员方法,类外:类名.成员 对象.成员
从以上我们就可以知道,静态成员的最大特点是不用和对象绑定在一起。这个方便的特性,也成了它的一个包袱:当在静态成员的类外时,如果是直接用类名.静态成员的方式访问,静态成员直接访问了一个非静态的成员(该被访问成员一般是类内的,如果是类外的,可能就先创建对象了,因为不能直接访问,这里的直接访问与访问权限没有概念上的关系,访问权限是设定了访问的范围,直接访问则是一种访问方式)。这个时候就出现一个问题,非静态的成员是怎么访问的?如果可以直接访问,难道它也是可以脱离对象的吗?(静态成员的访问是脱离了对象的,而静态成员又直接访问了非静态成员)答案显然是否定的。所以在静态方法中不可以直接访问类内的非静态成员,如果要访问非静态成员,则要先创建对象。
也许会有这样的疑问:既然是出在了非静态成员身上,那么可不可以用对象.static方法直接访问类内的成员?这个样子的实质还是直接访问了非静态成员,并不是说用了对象.static方法访问就可以改变静态方法访问类内成员的方式.还有一个疑问就是,super指针的使用.(意思是调用父类被覆盖的方法)
例子:
class Person{
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("子类");
}
public static void main(String args[])
{
getInfo();
}
}
看起来,这个例子中的
public static void getInfo()
{
super.getInfo();
System.out.println("子类");
}
super.getInfo();语句是个静态的方法,可以直接调用,但是这里的调用方式却是错误的,用到了super指针.如果是直接调用,没有对象的话,指针从哪里来的?所以这个疑问也是可以打消的.
记住课本上的三条规则.还有就是main()中也是不可以使用this及super指针的.
以后的所有设想都要用代码来表示,不然越说越模糊.
大家都知道在static方法中,不能访问类内非static成员变量和方法。可是原因是什么呢?
这首先要从static方法的特性说起。static方法,即类的静态成员经常被称为“成员变量”(class members),对于静态成员变量,我们叫类属性(class attributes),对于静态成员方法,我们叫类方法(class members)。其中静态成员变量:无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。我们可以直接使用类名来访问这个static变量,还可以在类的非静态的成员方法中像访问其他非静态成员变量一样去访问这个静态成员变量。对于静态方法,该方法不必和对象绑在一起。访问方式有三种,类内:非静态成员方法可以直接访问静态成员方法,类外:类名.成员 对象.成员
从以上我们就可以知道,静态成员的最大特点是不用和对象绑定在一起。这个方便的特性,也成了它的一个包袱:当在静态成员的类外时,如果是直接用类名.静态成员的方式访问,静态成员直接访问了一个非静态的成员(该被访问成员一般是类内的,如果是类外的,可能就先创建对象了,因为不能直接访问,这里的直接访问与访问权限没有概念上的关系,访问权限是设定了访问的范围,直接访问则是一种访问方式)。这个时候就出现一个问题,非静态的成员是怎么访问的?如果可以直接访问,难道它也是可以脱离对象的吗?(静态成员的访问是脱离了对象的,而静态成员又直接访问了非静态成员)答案显然是否定的。所以在静态方法中不可以直接访问类内的非静态成员,如果要访问非静态成员,则要先创建对象。
也许会有这样的疑问:既然是出在了非静态成员身上,那么可不可以用对象.static方法直接访问类内的成员?这个样子的实质还是直接访问了非静态成员,并不是说用了对象.static方法访问就可以改变静态方法访问类内成员的方式.还有一个疑问就是,super指针的使用.(意思是调用父类被覆盖的方法)
例子:
class Person{
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("子类");
}
public static void main(String args[])
{
getInfo();
}
}
看起来,这个例子中的
public static void getInfo()
{
super.getInfo();
System.out.println("子类");
}
super.getInfo();语句是个静态的方法,可以直接调用,但是这里的调用方式却是错误的,用到了super指针.如果是直接调用,没有对象的话,指针从哪里来的?所以这个疑问也是可以打消的.
记住课本上的三条规则.还有就是main()中也是不可以使用this及super指针的.
以后的所有设想都要用代码来表示,不然越说越模糊.
相关文章推荐
- static方法不能直接访问类内的非static变量和不能调用this,super语句分析
- static方法不能直接访问类内的非static变量和不能调用this
- static方法不能直接访问类内的非static变量和不能调用this,super语句分析
- java中static特殊性和final(static成员直接被访问,this不能用在static方法中,static不可访问非static)
- java中static特殊性和final(static成员直接被访问,this不能用在static方法中,static不可访问非static)
- static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用,为什么?
- 调用底层不能直接访问的类和方法
- static方法 内不能用this调用本类方法原因
- Java static方法不能直接调用非static方法和属性
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
- day59(5.9)程序报错类型之类中的静态方法不能直接调用动态方法
- 主线程不能直接调用webservice方法
- java 抽象类 抽象方法被调用 static 方法不能被复写
- 关于this和super关键字为什么不能再static方法中或者静态代码块中
- webservice可以访问但是不能调用方法
- main方法不能直接调用 非静态方法
- 含有abstract方法的类,同时又含有static方法。这种类不能被实例化,那可以调用static方法吗????
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
- static中不能调用类中非static方法
- static修饰的变量和方法直接用类进行调用,不需要先用new创建新的方法就能调用