ACAC 回顾Static,构造方法


/*
*
* 本章主要回顾static的用法:
*   构造方法,static变量,实例变量
*
* 1、先看下构造方法:
*       构造方法分为有参和无参,默认(不写)是无参
*       1、所谓构造方法,就是在创建对象的时候,直接赋值了
*           不用再单独写“对象.属性=***”;
*          举例:使用构造方法:Student stu = new Student(1234,88);
* `             不使用构造方法:
*                   Student1 student1 = new Student1();
*                    student1.Id = 121;
*                    student1.Grade = 88;
*            属性:1.不需要返回值类型,和类名一样
*                 2、使用的是重载机制(关于重载,下章回顾)
*            作用:方便对象属性的赋值
*
* 2、关于实例变量和静态变量
*   1、什么时候声明为实例变量?
*       这个类的所有对象的属性都不一定相同时,比如成绩,学号
*   2、什么时候声明为static变量?
*       当这个类的所有对象的某个属性都一样时,比如国籍(中国),职位(学生)
*   注意:定义为类级别特征,static变量,在方法区值保存一份,节省内存开销
*
*3、优缺点:
*   static变量:优点:1、属于类级别的,不需要创建对象就可以调用
*           2、全局唯一,内存唯一,可以标识某些状态(这个理解的不够全面)
*           3、类加载的时候初始化,常驻在内存中,调用方便
*      缺点:1、静态方法不能调用非静态方法和变量(非静态方法可以任意的调用静态方法,变量)
*           2、不能使用super和this关键字(类级别,没有创建对象签不可用this/super)
*           3、可能出现的缺点:
*                 初始化加载到内存,如果后续没有被引用,加大内存负担和程序运行负担
*                 影响程序运行
*           4、思考一下,如果你这个全局变量被多个引用赋值,是不是会导致参数值混乱?
*               答案:是的,怎么办?
*              这时final就经常和static联用了,强制不能修改
*
*   注意:static变量不能放在方法中,因为方法中声明的变量都是局部的
*        方法执行完后就要销毁,释放缓存空间,所以static变量不能放在方法中
*
* 4、使用场景(对2的补充):
*      1、当一个变量需要初始化加载的时候,或者经常被调用的时候可以加上static
*           为什么说经常被调用呢?
*          因为如果不声明为静态变量,在不同的类中调用,还得重新new对象再进行调用
*          声明为static变量,就直接类名.Method()使用,比较方便
*          其实这和工具类的含义差不多,都是经常使用的“static工具”
*      2、静态方法最适合工具类中方法的定义:
*           这时你就不用new对象,直接类名.Method()就可以使用,
*           使用java中的常用类就体现出来了
*           java中的文件操作,日期处理方法
*      3、静态方法适合入口方法的定义;如单例模式,因为从外部拿不到构造函数,所以定义一个
*          静态方法获取对象很有必要。(单例模式只是了解一下,构造方法私有,下面会写个最简单的)
*      4、静态变量适合全局变量的定义(当然最好加一个final,防止被修改),
*
* */




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

        //有参构造方法,new对象的时候直接赋值
        Student student = new Student(1222,99);

        //没有定义有参有参构造方法,逐个对属性进行赋值
        Student1 student1 = new Student1();
        student1.Id = 121;
        student1.Grade = 88;

        //DanLi danLi = new DanLi();报错
        //'DanLi()' has private access in 'DanLi'


        DanLi.GetInstance();

        DanLi danli = DanLi.GetInstance02();
        System.out.println(danli.toString());

        /*输出结果:hello java
                   DanLi@4f3f5b24
        */



    }
}
class Student{
    
    
    int Id;
    int Grade;

    //无参构造(默认)
    public Student(){
    
    

    }

    //有参构造
    public Student(int id, int grade) {
    
    
        Id = id;
        Grade = grade;
    }
}

class Student1{
    
    

    int Id;
    int Grade;

}
//构造简单单例模式
class DanLi{
    
    

    //要想获取这个对象,必须通过下面static方法获取
    private static DanLi person = new DanLi();

    //构造方法私有,外部无法通过new对象构建对象
    private  DanLi(){
    
    
    }

    //Instance是变量的意思,外部只能通过类名.Method()进行操作
    public static void  GetInstance(){
    
    
        System.out.println("hello java");
    }


    public static DanLi GetInstance02(){
    
    
            return person;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44707513/article/details/114434070