1. 简介
在Java中,static表示“静态的”,它也是一种修饰符,可以修饰属性、方法、代码块和内部类。
2. 特性
static修饰符具有如下特性:
● 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;
● 被static修饰的常量称为静态常量;
● 被static修饰的方法称为静态方法,也叫做类方法;
● 被static修饰的代码块叫做静态代码块;
● 被static修饰符的内部类,叫做静态内部类。
紧接上文对static做出小结
static关键字小结:
是什么?
static所修饰的代码属于类,所定义的变量存储在静态常量池中
为什么?
static之所以被设置,是为了方便类能够直接去使用自己的方法和变量
对象:对象是堆里面的一块内存空间
类中的代码以信息的形式存储在方法区当中
对于static方法,建议最好是用类去调用。对象是可以使用类的信息的,所以也可以用对象去调用
举例分析:
1.
A类:
public class A {
public static String name = "admin";
public static void run() {
System.out.println("跑的很快");
}
public static void flay() {
System.out.println("飞的很高");
}
}
Test类:
public class Test {
public static void main(String[] args) {
A a=new A();
a.run();
a.flay();
a.name="ss";
A.name="xx";
A.run();
A.flay();
}
}
2.
A类
public class A {
public static String name="admin";
public String address="保定";
public String toString(){
return "A{"+
"address='"+address+'\'' +
"address='"+address+'\'' +
'}'
;
}
}
Test类
public class Test {
public static void main(String[] args) {
A a1=new A();
A a2=new A();
a1.address="北京";
a1.name="aaaaaaaaaa";
a2.address="上海";
a2.name="cccccccccc";
System.out.println(a1.toString());
System.out.println(a2.toString());
}
}
运行结果:
方法
非静态方法可以调用静态方法,静态方法不可以调用非静态方法。
问题:
如何解决非静态方法不能被静态方法调用的问题?
1.将非静态方法改为静态方法
2.用创建对象的方式去调用
public class A {
public static String name="admin";
public String address="保定";
public String toString(){
return "A{"+
"address='"+address+'\'' +
"name='"+name+'\'' +
'}'
;
}
public static void aaa(){
}
public void bbb(){
}
public static void main(String[] args) {
//将非静态的aaa方法修改成静态的
aaa();
//生成对象,用对象区调用
A p=new A();
p.bbb();
}
}
为什么非静态方法可以调用静态方法?
非静态方法的使用必须要创建对象,而有对象一定是有类的
运行分析(难点):
代码
public class Demo {
public Demo(String aa) {
System.out.println("====" + aa);
}
static {
System.out.println("11");
}
public static Demo demo = new Demo("+++");
static {
System.out.println("22");
}
}
class Test{
public static void main(String[] args){
Demo demo = new Demo( "----");
}
}
运行分析:
1.main方法在哪里我们就先去扫描那个类----》首先去扫描Test类,发现没有父类,也没有static修饰的代码,那么编译Test类,并且将main方法入栈
2.执行new Demo("----");在执行之前扫描Demo类,发现没有父类,所以编译Demo类,在编译的过程中static代码块按顺序优先执行
3.首先输出的是11
4.执行 public static Demo demo = new Demo("+++");此时会涉及到调用Demo构造方法,所以输出 ===+++
5.输出 22
6.编译完毕,回到main方法当中继续执行new Demo("----");现在可以创建对象了!!也就是进行到了运行阶段
7.通过调佣构造器创建对象:===