static的特点、访问方式

1. static 修饰成员变量

static修饰分为两种:

                        类变量:有static修饰 属于类 会被类的全部对象共享。

                        实例变量(对象的变量):无static修饰 属于每个对象。

public class Student{
        // 类变量
        static String name;
        // 实例变量
        int age;
}

静态变量是属于类的 只需要通过类名就可以调用:类名.静态变量

实例变量是属于对象的,需要通过对象才能调用:对象.实例变量

代码演示:

public class Test{
    public static void main(String[] args){
        // 1.类变量的用法
        // 类名.变量名
        Student.name = "张三";
        System.out.print(Student.name);

        // 2.实例变量的用法    
        // 对象.实例变量
        s1.age = 23;
        s1.age = 18;
        System.out.print(S1.age);

        System.out.print(Student.age);    // 报错
    }    
}

2. static修饰成员方法

static修饰成员方法分为两种:

                        类方法:有static修饰的成员方法 属于类。

                        实例方法:无static修饰的成员方法 属于对象。

代码演示:

public class Student{
    double score;
    
    //类方法:
    public static void printHelloWorld{
        System.out.println("Hello World!");
        System.out.println("Hello World!");
    }
    
    //实例方法(对象的方法)
    public void printPass(){
        //打印成绩是否合格
        System.out.println(score>=60?"成绩合格":"成绩不合格");
    }
}

public class Test2{
    public static void main(String[] args){
        //1.调用Student类中的类方法
        Student.printHelloWorld();
        
        //2.调用Student类中的实例方法
        Student s = new Student();        
        s.printPass();
        
        //使用对象也能调用类方法【不推荐,IDEA连提示都不给你,你就别这么用了】
        s.printHelloWorld();
    }
}

有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。

无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。

3. static的注意事项

1.类方法中可以直接访问类的成员,不可以直接访问实例成员。

2.实例方法中既可以直接访问类成员,也可以直接访问实例成员。

3.实例方法中可以出现this关键字,类方法中不可以出现this关键字。

public class Student {
    static String schoolName; // 类变量
    double score; // 实例变量

    // 1、类方法中可以直接访问类的成员,不可以直接访问实例成员。
    public static void printHelloWorld(){
        // 注意:同一个类中,访问类成员,可以省略类名不写。
        schoolName = "黑马";
        printHelloWorld2();

        System.out.println(score); // 报错的
        printPass(); // 报错的

        ystem.out.println(this); // 报错的
    }
    
	// 类方法
    public static void printHelloWorld2(){

    }
    
    // 实例方法
    public void printPass2(){

    }
    
    // 实例方法
    // 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。
    // 3、实例方法中可以出现this关键字,类方法中不可以出现this关键字的
    public void printPass(){
        schoolName = "黑马2"; //对的
        printHelloWorld2(); //对的

        System.out.println(score); //对的
        printPass2(); //对的

        System.out.println(this); //对的
    }
}

4. static应用(代码块)

代码块根据有无static分为 静态代码块实例代码块

静态代码块

                格式:static{}

                特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。

                作用:完成类的初始化。例如:对类变量的初始化赋值。

public class Student {
    static int number = 80;
    static String schoolName = "黑马";
    // 静态代码块
    static {
        System.out.println("静态代码块执行了~~");
        schoolName = "黑马";
    }
}

静态代码块不需要创建对象就能够执行

public class Test {
    public static void main(String[] args) {
        // 目标:认识两种代码块,了解他们的特点和基本作用。
        System.out.println(Student.number);
        System.out.println(Student.number);
        System.out.println(Student.number);

        System.out.println(Student.schoolName); // 黑马
    }
}
实例代码块

                格式:{ }

                特点:每次创建对象时,执行实例代码块,并在构造器前执行。

                作用:和构造器一样,都是用来完成对象的初始化。例如 对实例变量进行初始化赋值。

实例代码块的作用和构造器的作用是一样的,用来给对象初始化值;而且每次创建对象之前都会先执行实例代码块。

public class Student{
    //实例变量
	int age;
    //实例代码块:实例代码块会执行在每一个构造方法之前
    {
        System.out.println("实例代码块执行了~~");
        age = 18;
        System.out.println("有人创建了对象:" + this);
    }

    public Student(){
        System.out.println("无参数构造器执行了~~");
    }

    public Student(String name){
        System.out.println("有参数构造器执行了~~");
    }
}

// 测试
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student("张三");
        System.out.println(s1.age);
        System.out.println(s2.age);
    }
}

5. static应用(单例设计模式)

单例设计模式:

                        单个实例,保证在整个系统中,当前对象只能有一个实例(只能new一次)。

                        常见分类:饿汉式,懒汉式

饿汉式:

                类在加载后,就已经进行实例化了。

public class Singleton {
    // 2.提供一个私有成员变量 类型为当前类 且需要实例化(在这个地方运行唯一一次new)
    private static Singleton singleton = new Singleton();
    // 1.提供一个【私有】的无参构造(在类的外面不能通过new创建实例)
    private Singleton() {
    }
    // 3.提供一个公共方法 用于 获取唯一实例
    public static Singleton getInstance(){
        return singleton;
    }
}
public class TestSingleton {
    public static void main(String[] args) {
        // 获得单例
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s1 == s2);

        /** 创建Singleton的实例 异常 在Singleton外面不能new 构造私有 */
				// Singleton s3 = new Singleton();
    }
}

懒汉式:

                 类在加载后没有进行实例化,在需要的时候进行实例化。

public class Singleton {
    //2.提供一个私有的成员变量 类型为当前类
    private static Singleton singleton;
    // 1.提供一个私有的无参构造(在类的外面不能通过new创建实例)
    private Singleton(){}
    //3.提供一个公共方法 如果没有实例 创建一个实例 如果有实例 返回即可
    public static Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}
饿汉式&懒汉式优缺点:

饿汉式:优点:代码结构简单 容易理解 ;安全 可以保证只有一个实例

缺点:可能会浪费资源

懒汉式:优点:延迟加载 需要的时候在加载 节约空间

缺点:不安全 可能会出现多个实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值