java基础-关键字:static、单例模式

1.例如:我们创造一个人的类,我们希望他是中国人类,所以我们希望所有对象都共有中国人的属性;

复制代码
import org.w3c.dom.ls.LSOutput;

import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Chinese c1 = new Chinese(25, "zhangsan");
        Chinese c2 = new Chinese(30, "lisi");
        c1.nation = "Chinese";
        System.out.println(c2.nation);



    }
}
class Chinese{
    public Chinese(int age, String name){
        this.age = age;
        this.name = name;
    }
    int age;
    String name;
    static String nation;
}

2.static可以修饰:

属性、方法、代码块、内部类;

(1)static修饰属性:多个对象共用一个,修改一个,会导致其他对象的该属性改变

说明:

①静态变量随着类的加载而加载,可以通过"类.静态变量"的方式调用;

②静态变量的加载早于对象的创建

③由于类只会加载一次,所以内存中只存在一份静态变量,存在于方法区的静态域中;

(2)static修饰方法:

①随着类的加载而加载,可以通过"类.静态方法"的方式进行调用;

②静态方法中,只能调用静态的属性和方法;

非静态方法中,都行;

3.注意点:静态方法中,不能使用this、super关键字;

开发中:一般工具类中的方法会声明为static方法;

4.单例设计模式:

单例模式分为两类:

饿汉式:

复制代码
class Bank{
    private Bank(){
        
    }
    private static Bank b1 = new Bank();
    
    public static Bank getBank(){
        return b1;
        
    }
    
    
}

懒汉式:

复制代码
import org.w3c.dom.ls.LSOutput;

import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {




    }
}
class Order{
    private Order(){

    }
    private static Order o1 = null;
    public static Order getOrder(){
        if(o1 == null){
            o1  = new Order();
            return o1;
        }else {
            return o1;
        }
    }


}

两种方式的对比:

饿汉式:

坏处:加载对象时间过长

好处:线程安全

懒汉式:

坏处:线程不安全;

单例模式的优点:

由于单例模式只产生一个实例,减少了系统性能开销,当一个对象产生需要比较多资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时产生一个单例对象,然后永久驻留内存的方式来解决;

5.代码块:

作用:初始化类、对象

修饰符:static

分为静态代码块和非静态代码块:

(1)静态:随着类的加载而执行,只会执行一次;初始化类的信息;静态代码块中只能调用静态属性和方法;同时多个,则按顺序执行

(2)非静态:随着对象的创建而执行;每创建一次就执行一次,可以对对象的属性进行初始化

复制代码
import org.w3c.dom.ls.LSOutput;

import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
    String s1 = Person.desc;




    }
}
class Person{
    String name;
    int age;
    static String desc = "我是一个人";
    public Person(){}
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("吃饭");
    }
    static {
        System.out.println("hello, static block");
    }
    {
        System.out.println("hello, block");
    }


}

会触发静态代码块运行;

复制代码
import org.w3c.dom.ls.LSOutput;

import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
    Person p1 = new Person();




    }
}
class Person{
    String name;
    int age;
    static String desc = "我是一个人";
    public Person(){}
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("吃饭");
    }
    static {
        System.out.println("hello, static block");
    }
    {
        System.out.println("hello, block");
    }


}

会同时触发两个代码块;

复制代码
import org.w3c.dom.ls.LSOutput;

import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
    Person p1 = new Person();
        System.out.println(Person.desc);




    }
}
class Person{
    String name;
    int age;
    static String desc = "我是一个人";
    public Person(){}
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("吃饭");
    }
    static {
        System.out.println("hello, static block");
        desc = "我是静态";
    }
    {
        System.out.println("hello, block");
    }


}

6.对对象可以赋值的位置:

(1)默认初始化

(2)显式赋值/代码块中赋值

(3)构造器赋值

(4)调用赋值

顺序:1-2-3-4

7.关键词final:最终的:

可以修饰的结构:类、方法、变量

(1)修饰类:不能被继承

(2)修饰方法:不能被重写

(3)修饰变量:此时的变量就称为一个常量:

①修饰属性:赋值位置:显式、构造器、代码块

②修饰局部变量:尤其形参时,在方法体内不能对形参重新赋值;

相关推荐
caimouse2 小时前
ReactOS 窗口系统分析(23):键盘 — keyboard.c + kbdlayout.c
c语言·开发语言·计算机外设
Emily156853598702 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧7 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡7 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管7 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅7 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒8 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰8 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
今天AI了吗9 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5219 小时前
selenium webdriver 第二次初始化的异常
开发语言·python