总述:static关键字可以用来修饰变量(属性),方法,内部类,代码块。用static修饰的资源表示该资源属于类级别,只属于某个类本身,而不是该类的对象。
1.static修饰成员变量
用static修饰成员变量,叫静态变量,属于类本身,而不是类的对象。不能通过对象引用访问,直接通过类名访问。
public class User {
private String name;
private int age;
public static int countNew;
public User(String name, int age) {
this.name = name;
this.age = age;
countNew++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
其中countNew成员前边用static修饰,表示该成员变量为静态变量,该变量和其他普通变量不同,该静态变量的值是共享的,不管该类被初始化多少次,值都共享。
其次静态变量和成员变量有着很大的不同,成员变量的值属于某个对象,不同的对象之间,值是不共享的;但静态变量不是的,它可以用来统计对象的数量,因为它是共享的。
public class UserTest {
public static void main(String[] args) {
User user = new User("1",18);
User user1 = new User("2",20);
System.out.println(User.countNew);
}
}
我们可以测试一下,允许以上代码,输出的结果是2,因为countNew的值是共享的,所以第二次new的时候是能取到countNew的前一个值然后进行++。
2.static修饰方法
static修饰方法叫静态方法,和静态变量类似,属于某个类,而不属于类得对象。
public static void setCountVlaue(int count){
User.countNew = count;
}
小结:
1.Java 中的静态方法在编译时解析,因为静态方法不能被重写(方法重写发生在运行时阶段,为了多态)
2.静态方法不能使用 this 和 super 关键字。
3.抽象方法不能是静态的。
4.静态方法无法直接访问成员方法和成员变量。
5.静态方法可以访问所有其他静态方法和静态变量。
6.成员方法也可以直接方法静态方法和静态变量。
7.成员方法可以直接访问其他成员方法和成员变量。
3.静态方法块
静态代码块可以用来初始化静态变量,尽管静态方法也可以在声明的时候直接初始化,但有些时候,我们需要多行代码来完成初始化。
一个类可以有多个静态代码块。
public class UserListDemo {
public static List<String> userList = new ArrayList<String>();
static {
userList.add("zhangsan");
userList.add("wangwu");
userList.add("xiaoer");
System.out.println("1");
}
static {
userList.add("xiaosan");
userList.add("dakuaitou");
System.out.println("2");
}
}
4.静态内部类
4.1内部类:
内部类是在外部类中再定义一个类,类名不需要和文件名相同。内部类官方叫嵌套类,嵌套类可分为静态内部类和非静态内部类。
非静态内部类包括,局部内部类,成员内部类,匿名内部类
总结:
1、静态内部类中可以写哪些内容
1)匿名代码块
2)静态代码块
3)静态变量和非静态变量
4)静态方法和非静态方法
注意:不能在静态内部类中写抽象方法
2、外部类如何调用静态内部类中的属性和方法
1)外部类可以通过创建静态内部类实例的方法来调用静态内部类的非静态属性和方法
2)外部类可以直接通过“ 外部类.内部类.属性(方法)” 的方式直接调用静态内部类中的静态属性和方法
3、静态内部类如何调用外部类的属性和方法
1)静态内部类可以直接调用外部类的静态属性和方法
2)静态内部类可以通过创建外部类实例的方法调用外部类的非静态属性和方法
4、如何创建静态内部类实例
1)在非外部类中:外部类名.内部类名 name = new 外部类名.内部类名();
2)在外部类中:内部类名 name = new 内部类名();