发布于2021-06-12 15:03 阅读(582) 评论(0) 点赞(4) 收藏(3)
静态的
可用来修饰属性,代码块,方法,内部类,存在方法区的静态区域里。
非静态属性:一个类中,每个对象都有自己的一套非静态属性,改变一个对象的属性值不会改变其他对象的属性值。
而静态属性则相反。
例如,若一个相同类中都有age属性,用static修饰,当用其中一个对象修改这个属性,则其他对象中的相同属性的值也被修改!
package com.hyb.KeyWord;
public class Static {
public static void main(String[] args) {
Static aStatic = new Static();
Static bStatic = new Static();
aStatic.a=10;
System.out.println(bStatic.a);//0
aStatic.b=10;
System.out.println(bStatic.b);//0
aStatic.c=10;
System.out.println(aStatic.c);//10
System.out.println(bStatic.c);//
}
int a;
int b;
static int c;
}
静态变量随着类的加载而记载,早于对象的创建,所以我们可以通过<类名.静态变量名>直接调用,但非静态变量不能直接调用,要new一个对象,用对象调用。
//上述类访问c
Static.c=10;
类加载一次,则静态变量也只加载一次
那么我们什么时候用static修饰我们的方法呢?
- 随着类的加载而记载,所以我们也可以直接拥类来调用,当然new一个对象也可调用他
- 但静态方法中,只能调用静态方法和静态属性,而非静态方法中,既能调用静态的,也可调用非静态的。
- 在静态方法中,this和super关键字不能使用,因为没有父类
那我们在开发中怎么确定一个属性和方法用static呢?
- 属性可以被多个对象共享,不会随着对象的不同而不同
- 操作静态属性的方法通常设置为静态的
- 工具方法的使用,也可以用static,直接拥<类.方法>来调用
package com.hyb.KeyWord;
public class Static {
public static void main(String[] args) {
Static aStatic = new Static();
Static bStatic = new Static();
System.out.println(aStatic.getId());
System.out.println(bStatic.getId());
System.out.println(a);
}
private static int a=10;
public int id=10;
public Static() {
id = ++a;
}
public int getId() {
return id;
}
}
static单例设计模式:
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对
某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构
造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生
类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无
法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,
静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象
的变量也必须定义成静态的。
package com.hyb.KeyWord;
//饿汉式
import javax.sound.midi.Soundbank;
import java.sql.SQLOutput;
public class SingleTest1 {
public static void main(String[] args) {
Student student1=Student.getStudent();
Student student2=Student.getStudent();
System.out.println(student1==student2);//true是同一个对象
}
}
class Student{
//建造稀有构造器
private Student() {
}
//new一个static的对象
private static Student student=new Student();
//提供一个获取该实例的方法
public static Student getStudent() {
return student;
}
}
package com.hyb.KeyWord;
//懒汉式
public class SingleTest2 {
public static void main(String[] args) {
Techer techer1=Techer.getTecher();
Techer techer2=Techer.getTecher();
System.out.println(techer1==techer2);//true
}
}
class Techer{
//声名一个私有的构造器
private Techer(){
}
//声名对象,但没有初始化
private static Techer techer=null;
//提供new一个对象的方法
public static Techer getTecher() {
//必须要有判断,因为对象只能被new一次
if(techer==null){
techer = new Techer();
}
return techer;
}
}
懒汉式效率上一般比饿汉式长,因为饿汉式是先创建对象,让对象的加载时间过长,而懒汉式是要用的时候才创建对象。但饿汉式是线程安全的,什么是线程安全呢?通俗来讲,就是当一个人在抢票,刚进去看到票没有被卖出,但这个时候另一个人也刚好进来了,也可能会判定这张票是没被卖出的。
在设计中,一般在以下的情况做成单例模式:
网站的计数器,一般也是单例模式实现,否则难以同步。
应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志
文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。
Application 也是单例的典型应用
Windows的Task Manager (任务管理器)就是很典型的单例模式
Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例
package com.hyb.KeyWord;
//Final关键字可以修饰的结构(最终的)
/*修饰类
1.表示最终的类,此类不能被继承,String,System,StringBuffer类都是final修饰的
* final修饰方法
1.不能被重写
*final修饰一个变量
1.修饰属性,表示常量,可在显示初始化,代码块,构造器中,但不能定义为默认初始化中或者在方法中赋值
2.修饰局部变量也表示常量
3.修饰形参,只能被调用,一旦赋值以后便不能重新被修改
4.在new对象的语句中赋值,这里可new不同的对象,赋多个不同的值,这是可以的,因为不同的对象,但下一次在相同的对象下就不可以赋值了
*
static final修饰属性表示全局常亮
*/
public class Final {
}
原文链接:https://blog.csdn.net/weixin_47303191/article/details/117715867
作者:java王侯
链接:http://www.javaheidong.com/blog/article/222395/05c8a83150928d884a90/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!