zoukankan      html  css  js  c++  java
  • Java 基础(static 关键字)

    当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

    static关键字的使用

    1. static: 静态的

    2. static 可以用来修饰:属性、方法、代码块、内部类

    3. 使用 static 修饰属性: 静态变量(或类变量)
      3.1 属性, 按是否使用 static 修饰,又分为:静态属性 和 非静态属性(实例变量)
      实例变量: 我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
      静态变量: 我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
      3.2 static 修饰属性的其他说明
      ① 静态变量随着类的加载而加载,可以通过 "类.静态变量" 的方式进行调用
      ② 静态变量的加载要早于对象的创建。
      ③ 由于类只会加载一次,则静态变量在内存中也只会存在一份,存在方法区的静态域中。

    类变量 实例变量
    yes no
    对象 yes yes

    3.3 静态属性举例: System.out; Math.PI;

    1. 使用static修饰方法: 静态方法
      ① 随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
    静态方法 非静态方法
    yes no
    对象 yes yes

    静态方法中,只能调用静态的方法或属性
    非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

    1. static 注意点:
      5.1 在静态的方法内,不能使用this关键字, super关键字
      5.2 关于静态属性和静态方法的使用,大家都从生命周期的角度去理解。

    6.开发中,如何确定一个属性是否要声明为 static 的?
    > 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。

    开发中,如何确定一个方法是否要声明 为static 的?
    > 操作静态属性的方法,通常设置为 static 的
    > 工具类中的方法,习惯上声明为 static 的。比如:Math、Arrays、collectionsI

    StaticTest.java

    package com.klvchen.java1;
    
    public class StaticTest {
    	
    	public static void main(String[] args) {
    		
    		Chinese c1 = new Chinese();
    		c1.name = "lily";
    		c1.age = 18;
    		c1.nation = "CHN";
    		
    		Chinese c2 = new Chinese();
    		c2.name = "lucy";
    		c2.age = 17;
    		c2.nation = "CHINA";
    		
    		System.out.println(c1.nation); 
    		
    		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();
    	}
    	
    	public static void show() {
    		System.out.println("我是一个中国人");
    //		eat();
    //		name = "Tom";
    		System.out.println(Chinese.nation);
    		walk();
    		System.out.println("nation: " + Chinese.nation);
    	}
    	
    	public void info() {
    		System.out.println("name :" + name + ", age : " + age);	
    	}
    	
    	public static void walk() {
    		System.out.println("走路");
    	}
    }
    

    运行结果:

    SingletonTest.java

    package com.klvchen.java;
    
    public class SingletonTest {
    	public static void main(String[] args) {
    		Bank bank1 = Bank.instance;
    		
    		Bank.instance = null;
    		
    		Bank bank2 = Bank.instance;
    		
    		System.out.println(bank1);
    		System.out.println(bank2);
    		System.out.println(bank1 == bank2);
    		
    	}
    
    }
    
    class Bank{
    	private Bank() {
    		
    	}
    	
    	public  static Bank instance = new Bank();
    }
    
    

  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/klvchen/p/14473949.html
Copyright © 2011-2022 走看看