Java面向对象OOP(下)

关键字:static

为什么有static

在这里插入图片描述

static关键字的使用

在这里插入图片描述

静态属性

在这里插入图片描述

在这里插入图片描述

  • 属性 按 是否使用static分类:
    ①static 修饰的属性 :静态变量 或 类变量,从名字类变量可看出,其是属于类的,可不创建对象,直接用类调用
    ②非static 修饰的属性:非静态变量 或 实例变量,其是属于对象的,必须由创建的对象调用。
public class AnimalTest {
    
    
    public static void main(String[] args) {
    
    
        Preson.nation = "china";//直接用类调用,不用创建对象
        Preson preson = new Preson();
        preson.name = "d";//创建对象后才能调用
    }
}


class Preson{
    
    
    static String nation;
    String name;
}

类变量 vs 实例变量内存解析

  • 类变量(静态属性)放在方法区的静态域中

在这里插入图片描述

静态方法

在这里插入图片描述
在这里插入图片描述

  • static方法内只能访问static修饰的属性和方法不能访问非static的结构,是因为生命周期的原因,静态属性和方法,随类的加载而加载,非静态属性和方法随对象的创建而加载,即静态属性和方法先于非静态属性和方法出现,所以static方法内只能访问static修饰的属性和方法不能访问非static的结构,因为这时非static的结构还未出现;而非static的结构即可访问非static的结构,也可访问static的结构。

属性和方法什么时候该用static

例子:

编写一个实现银行账户的类,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,
考虑:哪些属性可以设计成static属性?

通过new类,创建出不同的账户,显然,不同人的账户,“帐号”、“密码”、“存款余额”不能共用,所以这些属性是属于对象的,要设计成非static属性;而不同人的账户的“利率”、“最小余额”是一样的,可共用,所以这些属性是属于类的,要设计成static属性。
在这里插入图片描述

扫描二维码关注公众号,回复: 12912868 查看本文章

单例 (Singleton)设计模式(应用关键字:static)

在这里插入图片描述

单例设计模式-饿汉式

  • 上来就new一个对象 private static Singleton single = new Singleton();,即饿汉式
public class SingletonTest {
    
    
    public static void main(String[] args) {
    
    
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        //由于static,该类只存在一个对象实例;
        // 创建的instance1和instance2指向同一个对象
        System.out.println(instance1 == instance2);//true
    }
}


class Singleton {
    
    
    // 1.私有化构造器
    private Singleton() {
    
    
    }
    // 2.内部提供一个当前类的实例
// 4.此实例也必须静态化
    private static Singleton single = new Singleton();
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
    
    
        return single;
    }
}

单例设计模式-懒汉式

  • 先声明一个对象private static Singleton single;,用到在创建,即,比较懒,懒汉式。
  • 下面的写法线程不安全。原因在if(single == null)
public class AnimalTest {
    
    
    public static void main(String[] args) {
    
    
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        //由于static,该类只存在一个对象实例;
        // 创建的instance1和instance2指向同一个对象
        System.out.println(instance1 == instance2);//true
    }
}


class Singleton {
    
    
    // 1.私有化构造器
    private Singleton() {
    
    
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single;
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
    
    
        if(single == null) {
    
    //可导致法线程不安全
            single = new Singleton();
        }
        return single;
    }
}

饿汉式、懒汉式区别

在这里插入图片描述

  • 饿汉式的对象加载时间过长,是因为static关键字修饰的结构生命周期长。

优点

在这里插入图片描述

应用场景

在这里插入图片描述

main方法

在这里插入图片描述

  • main方法是在编译后的执行时,接受String[] args数组参数的,用于和控制台交互(之前使用Scanner)
  • 编译:javac 运行的类名
  • 执行:java 运行的类名 第一个参数 第二个参数 第三个参数 ...

关键字:final

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42647047/article/details/115201073
今日推荐