/*
*
* 本章主要回顾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;
}
}
版权声明:本文为qq_44707513原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。