java类实例能访问静态属性_Java学习笔记8---类的静态成员变量与静态成员⽅法的访问。。。
(注:静态变量修改为静态成员变量,静态⽅法改为静态成员⽅法)
静态成员变量⼜称类变量,静态成员⽅法⼜称类⽅法,它们统称为静态成员或类成员。静态成员由static修饰,是属于整个类的,所有的对象共享这些静态成员。不需要创建任何对象,静态成员在类装载时就已初始化了,整个运⾏期间其内存位置不变,直到类卸载。鉴于静态成员的这些特性,访问静态成员变量以及定义或调⽤静态成员⽅法时与⾮静态成员也有不同之处。下⾯分别做出说明。
1.静态成员变量
类的⾮静态成员⽅法、静态成员⽅法都可以直接访问静态成员变量
其他类要访问某个类的静态成员变量,既可以通过实例名访问,也可以直接⽤类名来访问,推荐⽤类名访问的⽅式,这样能更直观的说明访问的变量是静态成员变量
2.静态⽅法
不能直接访问⾮静态成员变量,也不能直接调⽤⾮静态成员⽅法,需要实例化⼀个对象,再通过该对象来访问要访问的⾮静态成员变量或要调⽤的⾮静态成员⽅法。也就是说,静态成员⽅法不能直接使⽤⾮
静态成员。个⼈理解是,⾮静态成员变量是依托对象⽽存在的,当没有实例⼀个对象时,⾮静态成员变量是没有分配内存空间的,静态⽅法要使⽤⾮静态成员变量不知道要到哪⾥去,当然就不能直接使⽤⾮静态成员变量了。⽽⾮静态成员⽅法有有可能访问⾮静态成员变量,所以也不能直接调⽤⾮静态成员⽅法了。
其他类要调⽤某个类的静态成员⽅法,既可以通过实例名调⽤,也可以直接⽤类名来调⽤,推荐⽤类名调⽤的⽅式,这样能更直观的说明调⽤的⽅法是静态成员⽅法
3.下⾯以简单的代码验证上⾯的结论
定义了⼀个Person类,类的代码见最后⾯。
(1).类的静态成员⽅法和⾮静态成员⽅法都可以直接访问静态成员变量
静态成员⽅法staticMethod访问了静态成员变量citizenship
定义并使⽤了局部变量testY
⾮静态成员⽅法informationPrint访问了静态成员变量citizenship
staticMethod()⽅法如下:
public static void staticMethod() {
int testY = 20;
System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
}
informationPrint()⽅法如下:
public void informationPrint() {
System.out.println("My name is " + getName());
System.out.println("I am " + getAge() + " years old");
if(getGender() == "female")
System.out.println("I am a girl");
else
if(getGender() == "male")
System.out.println("I am a boy");
else
System.out.println("Something is wrong!");
System.out.println("My hobby is " + hobby);
if(citizenship == "Chinese")
System.out.println("I am a chinese");
else
if(citizenship == "US")
System.out.println("I am an American");
else
System.out.println("Oh,something is wrong");
}
main()⽅法如下:
public static void main(String[] args) {
Person xiaoxi = new Person("xiaoxi",29,"female","piano"); xiaoxi.informationPrint();
staticMethod();
}
输出结果如下:
My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old
结果分析:
静态成员⽅法可以直接访问静态成员变量
静态成员⽅法可以⾃定义局部变量
⾮静态成员⽅法可以直接访问静态成员变量
(2),静态成员⽅法不可以直接访问⾮静态成员变量
[1].staticMethod直接访问静态成员变量citizenship,出现错误静态成员⽅法staticMethod访问了静态成员变量citizenship
定义并使⽤了局部变量testY
访问了⾮静态成员变量hobby
staticMethod()⽅法如下:
public static void staticMethod() {
int testY = 20;
System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
学习java的学习方法System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + hobby); //nonstatic variable access
}
main⽅法同上。
输出结果如下:
My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static field hobby
at human.Person.staticMethod(Person.java:99)
at human.Person.main(Person.java:107)
结果分析:
静态成员⽅法不能直接访问⾮静态成员变量,否则会出现“Cannot make a static reference to the non-static field hobby” 的错误。
[2].staticMethod()创建⼀个对象testP,由testP访问⾮静态成员变量hobby,成功执⾏
静态成员⽅法staticMethod使⽤了静态成员变量citizenship
定义并使⽤了局部变量testY
创建⼀个Person实例testP,并使⽤了testP的变量hobby
staticMethod()⽅法如下:
public static void staticMethod() {
int testY = 20;
Person testP = new Person();
System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
}
main⽅法同上。
输出结果如下:
My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old
She doesn't like null
结果分析:
静态成员⽅法要访问⾮静态成员变量,可以先实例化⼀个对象,再通过对象访问。
(3),静态成员⽅法不可以直接调⽤⾮静态成员⽅法
[1].staticMethod()直接访问⾮静态成员⽅法informationPrint(),出现错误
静态成员⽅法staticMethod使⽤了静态成员变量citizenship
定义并使⽤了局部变量testY
创建⼀个Person实例testP,并使⽤了testP的hoppy变量
直接调⽤⾮静态成员⽅法informationPrint()
staticMethod()⽅法如下:
public static void staticMethod() {
int testY = 20;
Person testP = new Person();
System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
//System.out.println("She doesn't like " + testP.hobby); //nonstatic variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP System.out.println("Her personal information is as follows:");
informationPrint();
}
main()⽅法同上。
输出结果如下:
My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static method informationPrint() from the type Person
at human.Person.staticMethod(Person.java:103)
at human.Person.main(Person.java:111)
结果分析:
静态成员⽅法不能直接调⽤⾮静态成员⽅法,否则会出现与直接访问⾮静态成员变量类似的错误,Cannot make a static reference to the non-static method informationPrint() from the type Person。
[2].通过已有对象testP来调⽤informationPrint()⽅法,成功执⾏
静态成员⽅法staticMethod使⽤了静态成员变量citizenship
定义并使⽤了局部变量testY
创建⼀个Person实例testP,并使⽤了testP的hoppy变量
通过testP调⽤⾮静态成员⽅法informationPrint()
staticMethod()⽅法如下:
public static void staticMethod() {
int testY = 20;
Person testP = new Person();
System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
System.out.println("Her personal information is as follows:");
//informationPrint();
testP.informationPrint();
}
main()⽅法同上。
输出结果如下:
My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论