Java关键字(三): static
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!
 
“ static ” 关键字的使用
1. 引入

2. 理解
3. 使用
3.1 使用范围
3.2 static修饰属性
3.2.1 设计思想
3.2.2 分类
3.2.3 注意
| 静态变量 | 实例变量 | |
|---|---|---|
| 类 | yes | no | 
| 对象 | yes | yes | 
3.2.4 举例
public class Test1 {
    public static void main(String args[]) {
                Circle c1 = new Circle(2.0);
                Circle c2 = new Circle(3.0);
                c1.display();//name:这是一个圆radius:2.0
                c2.display();//name:这是一个圆radius:3.0
    }
}
class Circle {
    private double radius;
    public static String name = "这是一个圆";
    public static String getName() {
        return name;
    }
    public Circle(double radius) {
        this.radius = radius; 
    }
    public double findArea() {
        return Math.PI * radius * radius; 
    }
    public void display() {
        System.out.println("name:" + name + "radius:" + radius);
    } 
}
 
  class Person {
   private int id;
   public static int total = 0;
   public Person() {
     total++;
     id = total;
}
    public static void main(String args[]){
      Person Tom=new Person();
      Tom.id=0;
      total=100; // 不用创建对象就可以访问静态成员
    } 
}
 
  
public class StaticDemo {
    public static void main(String args[]) {
      Person.total = 100; // 不用创建对象就可以访问静态成员
      //访问方式:类名.类属性,类名.类方法
      System.out.println(Person.total);
      Person c = new Person();
      System.out.println(c.total); //101
    }
}
 3.2.5 类变量内存解析
⭕ 图解1:
 
 ⭕ 图解2:
 
3.3 static修饰方法
3.3.1 设计思想
3.3.2 理解
3.3.3 使用
| 静态方法 | 非静态方法 | |
|---|---|---|
| 类 | yes | no | 
| 对象 | yes | yes | 
3.3.4 注意
3.3.5 举例
public class StaticTest {
	public static void main(String[] args) {		
		Chinese.nation = "中国";				
		Chinese c1 = new Chinese();
		c1.name = "姚明";
		c1.age = 40;
		c1.nation = "CHN";		
		Chinese c2 = new Chinese();
		c2.name = "马龙";
		c2.age = 30;
		c2.nation = "CHINA";		
		System.out.println(c1.nation);//CHINA		
		//编译不通过
//		Chinese.name = "张继科";				
		c1.eat();		
		Chinese.show();
		//编译不通过
//		Chinese.eat();
//		Chinese.info();
	}
}
//中国人
class Chinese{	
	String name;
	int age;
	static String nation;	
	public void eat(){
		System.out.println("中国人吃中餐");
		//调用非静态结构
		this.info();
		System.out.println("name :" +name);
		//调用静态结构
		walk();
		System.out.println("nation : " + nation);
	}	
	public static void show(){
		System.out.println("我是一个中国人!");
		//不能调用非静态的结构
//		eat();
//		name = "Tom";
		//可以调用静态的结构
		System.out.println(Chinese.nation);
		walk();
	}	
	public void info(){
		System.out.println("name :" + name +",age : " + age);
	}	
	public static void walk(){		
	}
}
 4. 注意
5. 单例 (Singleton)设计模式
5.1 概述
5.2 优点
5.3 单例设计模式-饿汉式
class Singleton {
    // 1.私有化构造器
    private Singleton() {
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single = new Singleton();
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
    return single; 
    } 
}
 5.4 单例设计模式-懒汉式
(1)单例设计模式-懒汉式(线程不安全)
class Singleton {
    // 1.私有化构造器
    private Singleton() {
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single;
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
      if(single == null) {
      single = new Singleton();
      }
     return single; 
     } 
}
 (2)单例设计模式-懒汉式(线程安全)
public class BankTest {
}
class Bank{
    private Bank(){}
    private static Bank instance = null;
    public static Bank getInstance(){
        //方式一:效率稍差
//        synchronized (Bank.class) {
//            if(instance == null){
//
//                instance = new Bank();
//            }
//            return instance;
//        }
        //方式二:效率更高
        if(instance == null){
            synchronized (Bank.class) {
                if(instance == null){
                    instance = new Bank();
                }
            }
        }
        return instance;
    }
}
 









