目录
一、static关键字
1.static:静态的
2.static可以用来修饰:属性、方法、代码块、内部类
3.使用static修饰属性:静态变量(或类变量)
>3.1属性、按是否使用static修饰,又分为:静态属性vs 非静态属性(实例变量)
>实例变量:当我们创建了类的多个对象,每个对象都独立地拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改
>静态变量:我们创建了多个类的多个对象,多个对象共享同一个静态变量。当通过一个对象修改静态变量时,其他对象再调用此静态变量时,是修改过了的。
3.2static修饰属性的其他说明
①静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
②静态变量的加载早于对象的创建。
③由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
④
类变量 实例变量 类 yes no 对象 yes yes 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修饰方法:静态方法
①随着类的加载而加载,可以通过“类.静态方法”的形式去调用
②
静态方法 非静态方法 类 yes no 对象 yes yes
③静态方法中,只能调用静态的方法或属性 。
>非静态的方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
在下面的代码中我们的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)所说的就是声明一个静态的没有返回值的公共权限的方法,其参数为一个字符串。