本文解决两个问题
为什么使用静态变量
静态方法为什么不能调用非静态成员?
静态方法和实例方法有何不同?
类名.方法名
的方式,也可以使用 对象.方法名
的方式,而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象 。对象.方法名
的方式来调用静态方法。这种方式非常容易造成混淆,静态方法不属于类的某个对象而是属于这个类。因此,一般建议使用 类名.方法名
的方式来调用静态方法。静态成员的特点
静态成员包括哪些
来个例子
需求:定义人类,属性有姓名,性别,生命次数
分析:
代码:
public class Person {
String name; // 实例属性
String gender; // 实例属性
static int live = 1; // 静态属性
public Person(String name, String gender) {
this.name = name;
this.gender = gender;
}
public void sayHello(){
System.out.printf("我是%s,%s生,我们都知道人的生命只有%d次\n",this.name,this.gender,Person.live);
}
public static void main(String[] args) {
Person p1 = new Person("美少女","女");
Person p2 = new Person("浩哥","男");
p1.sayHello();
p2.sayHello();
}
}
内存分配(重点):
继续深入
p1.live = 2;
System.out.println(p2.live);
System.out.println(Person.live);
答案都是2,这就证明了静态变量live可以在p1和p2之间共享
小结:
检验一下
public class Test {
int age;
public static void main(String[] args) {
age = 1;
System.out.println(age);
}
}
第5行报错:原因是静态方法main访问了实例属性age
public class Test {
public void add(){
System.out.println("调用了add方法");
}
public static void sub(){
System.out.println("调用了sub方法");
add();
}
public static void main(String[] args) {
sub();
}
}
第8行报错:原因是静态方法sub调用了实例方法add
public class Test {
public void add(){
System.out.println("调用了add方法");
}
public static void sub(){
System.out.println("调用了sub方法");
new Test().add();
}
public static void main(String[] args) {
sub();
}
}
正确,这个题目是对上一个题目的改进,正确的原因是第8行在调用add方法前,已经new出了Test类的对象,然后由Test类的对象调用实例方法add。
powered by kaifamiao