JAVA【static关键字】【单例模式】【理解main方法的语法】

目录

一、static关键字 

 二、单例设计模式 

1.饿汉式

 2.懒汉式

单例设计模式的应用场景 

三、理解main的语法

一、static关键字 

1.static:静态的

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

3.使用static修饰属性:静态变量(或类变量)

>3.1属性、按是否使用static修饰,又分为:静态属性vs 非静态属性(实例变量)

>实例变量:当我们创建了类的多个对象,每个对象都独立地拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改

>静态变量:我们创建了多个类的多个对象,多个对象共享同一个静态变量。当通过一个对象修改静态变量时,其他对象再调用此静态变量时,是修改过了的。

3.2static修饰属性的其他说明

①静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用

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

③由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。

类变量实例变量
yesno
对象yesyes

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

在下面的代码中可以看出只要我们其中一个对象修改了static属性的变量,其他对象的同名的static属性的变量都是会发生同步改变的。 

package zhuyuan;

public class statictest {
    public static void main(String[] args) {
        Chinese.nation="中国";
        
        Chinese c1=new Chinese();
        c1.name="姚明";
        c1.age=40;

        Chinese c2=new Chinese();
        c2.name="马龙";
        c2.age=30;
        
        c1.nation="CHN";
        System.out.println(c2.nation);
        
    }
}
//中国人
class Chinese{
    String name;
    int age;
    static String nation;
}

4.使用static修饰方法:静态方法

①随着类的加载而加载,可以通过“类.静态方法”的形式去调用

静态方法非静态方法
yesno
对象yesyes

③静态方法中,只能调用静态的方法或属性 。

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

在下面的代码中我们的show()方法是一个静态的方法,我们直接使用类名就可以调用我们的show()方法 

package zhuyuan;

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

        Chinese.show();
    }
}
//中国人
class Chinese{
    String name;
    int age;
    static String nation;
    public void eat(){
        System.out.println("我要吃满汉全席");
    }
    public static void show(){
        System.out.println("我是一个中国人");
    }
}

 5.static注意点

>5.1在静态方法内,不能使用this关键字,super关键字,因为这两个关键字都是要基于已有的对象来调用的。

>5.2关于静态属性和静态方法的使用,建议都从生命周期的角度去理解。

6.如何确定一个属性是否要声明为static

>属性是可以被多个对象所共享的,不会随着对象的不同而不同。

>类中的常量也通常生命为static。

如何确定一个方法是否要声明为static

>操作静态属性的方法,通常设置为static的

>工具类中的方法,习惯上声明为static的。比如math/arrays/collections

在下面的代码中,我们实现了id自动累加赋值,其利用的特性就是我们的staic。 

package zhuyuan;

public class statictest {
    public static void main(String[] args) {
        Chinese c1=new Chinese();
        Chinese c2=new Chinese();
    }
}
//中国人
class Chinese{
    String name;
    int age;
    static String nation;
    public void eat(){
        System.out.println("我要吃满汉全席");
    }
    public static void show(){
        System.out.println("我是一个中国人");
    }
    public int id;
    public static int init=1001;
    public static int total;
    public Chinese(){
        id=init++;
        System.out.println(id);
        total++;
        System.out.println(total);
    }
    
}

 

 二、单例设计模式 

某个类只能存在一个实例。

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

如何实现:

1.饿汉式

直接创建对象。

package singleton;

//饿汉式单例设计模式
public class Singletontest {
    public static void main(String[] args) {
        Bank bank1=Bank.getInstance();
    }
}
class Bank{
    //1.私有化类的构造器
    private Bank(){

    }
    //2.内部创建类
    //4.要求此对象也必须是静态的
    private static Bank instance=new Bank();

    //3.从提供的公共的静态的方法,返回类的对象
    public static Bank getInstance(){
        return instance;
    }
}

 2.懒汉式

只有到真正要用到对象的时候才创建对象,一开始如果没有用到对象就是null。

package singleton;

public class Singletest2 {
    public static void main(String[] args) {
        Order order1=Order.getInstance();
        Order order2=Order.getInstance();
        System.out.println(order1==order2);
    }
}

class Order{
    //1.私有化类的构造器
    private  Order(){
        
    }
    
    //2.声明当前类对象,没有初始化
    //4.此对象也必须生命为static
    private static Order instance=null;
    
    //3.声明public/static的返回当前类对象的方法
    public static Order getInstance(){
        if(instance==null){
            instance=new Order();
            return instance;
        }
        else{
            return instance;
        }
    }
}

 区分饿汉式和懒汉式

饿汉式:坏处:对象加载时间过长

                好处:饿汉式是线程安全的

懒汉式:好处:延迟对象的创建

                目前的写法坏处:线程不安全

单例设计模式的应用场景 

 网站的计数器:一般是单例设计模式,否则很难实现同步

应用程序的日志应用:一般由单例设计模式去实现,应为共享的日志文件一直处于打开的状态,因为只能由一个实例去操作

数据库链接池的设计

项目中,读取配置文件的类

Application

Windows的任务管理器

Windows的回收站。在整个系统运行的过程中,回收站一直维护的是一个实例

三、理解main的语法

 main()方法的使用说明:

1.main()方法作为程序的入口

2.main()方法也是一个普通的静态方法

3.main()方法也可以作为我们与控制台交互的方式(之前scanner)

//package singleton;

public class maintest {
    public static void main(String[] args){//入口
        Main.main(new String[100]);
    }
}

class  Main{
    public static void main(String[] args) {
        args=new String[100];
        for(int i=0;i<args.length;i++)
        {
            args[i]="arg_"+i;
            System.out.println(args[i]);
        }
    }
}

 

public static void main(String[] args)

所说的就是声明一个静态的没有返回值的公共权限的方法,其参数为一个字符串。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桜キャンドル淵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值