Java笔记2 面向对象<2>static关键字、main函数、静态运用、单例设计模式

时间:2021-10-24 20:48:00


06天-01-面向对象(static关键字)

l  static 关键字

用于修饰成员(成员变量和函数)。

l  被修饰后的成员变量具备如下特点:

1)       随着类的加载而加载。也就是说:静态会随着类的消失而消失,说明他的生命周期最长。

2)       优先于对象存在。明确一点:静态是先存在,对象时候存在。

3)       被所有对象所共享;

4)       可以被类名直接调用。(调用方式:类名.静态成员)

l  使用时应注意:

静态方法只能访问静态成员;

1)       静态方法中不能写this、super关键字;

2)       主函数是静态的。

l  实例变量和类变量的区别:

1.存放位置:

1)       类变量随着类的加载而加载,而存在于方法区中;

2)       实例变量随着对象的建立而存在对内存中。

2.生命周期:

1)       类变量的生命周期最长,随着类的消失而消失;

2)       实例变量生命周期随着对象的小时而消失。

l  静态使用的注意事项:

1)       静态方法只能访问静态成员;

非静态成员既可访问静态也可以访问非静态。

2)       静态方法中不可以定义this、super关键字;

因为静态优先于对象存在,所以静态方法不可以出现this、super关键字。

3)       主函数是静态的。

l  静态有利有弊

1)       利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象都存储一份。可以直接被类名调用。

2)       弊端:生命周期最长。而且访问出现局限性(只能访问静态)。

 

 

6天-02-面向对象(main函数)

代码演示:

class MainDemo{

       publicstatic void main(String[] args){

              String[] str = {“hah”,”hhe”,”heihei”,”xixi”,”hoho”};

MainTest.main(str);

       }

}

 

Class MainTest{

       publicstatic void main(String[] args){

for(inti=0;i<args.length;x++){

       System.out.println(args[i]);

}

}

}

 

 

06天-03-面向对象(静态什么时候使用)

l  什么时候使用静态?

要从两方面入手:成员变量和函数。

l  什么时候定义静态变量(类变量)呢?

当对象中出现共享数据时,该数据被静态所修饰。

对象中的特有数据要定义成非静态存在于对内存中。

l  什么时候使用静态函数呢?

当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

       示例:

       privateString name;

       privatestatic int count;

       publicstatic void show(){

       System.out.println(“haha”);//未访问到非静态数据

       //System.out.println(name+”haha”);//访问到飞静态成员,只能定义在非静态函数中。

       System.out.println(“计数:”+count++);//静态成员可以定义在静态函数中

}

²  扩充:静态成员变量实现自增或自减的代码示例

class Test{

       privatestatic int count1 = 10;

       privateint count2 = 10;

 

       publicstatic void main(String[] args){

              Test test1 = new Test();

              for(int i=0;i<10;i++){

       System.out.print(test1.show1()+”  ”);

}

System.out.println();

for(int i=0;i<10;i++){

       System.out.print(test2.show2()+”  ”);

}

System.out.println();

Test test2 = new Test2();

System.out.println(test2.show1());

System.out.println(test2.show2());

}

 

public staticint show1 (){

       return count1--;

}

 

public staticint show2(){

       return count2--;

}

}

打印结果:

10  9 8  7  6 5  4  3 2  1 

10  9 8  7  6 5  4  3 2  1 

0

10

打印结果表明:static修饰的成员变量(private static int count = 10)被所有对象锁共享,如果上一个对象修改了static修饰的成员变量值,那么下一个象调用该成员变量时所得到的值是将是上一对象使用后的最终值。

 

 

06天-06-面向对象(静态代码块)

l  静态代码块的格式:

static {

    静态代码块中的执行语句;

}

l  特点:

随着类的加载而执行,只执行一次,并优先于主函数执行。用于给类进行初始化。

l  代码块和静态代码块的执行顺序举例举例:

 

public class BaseTest7 {

 

    private int num = 2;

   

    {

        System.out.println("a");

    }

   

    BaseTest7(){

        System.out.println("b");

    }

   

    BaseTest7(String name){

        System.out.println("带参数的构造函数:"+name);

    }

    static{

        System.out.println("c");

    }

   

    public static void main(String[] args) {

        System.out.println("e");

        System.out.println("f");

        new BaseTest7();

        System.out.println("--------");

        new BaseTest7("新对象");//再次new新对象,静态代码块不会再执行

    }

}

打印结果:

e

f

--------

带参数的构造函数:新对象

 

结论:

1)  静态代码代码块随着类的加载而优先执行,并优先主函数执行;

2)  代码块滞后主函数执行,但优先于构造函数执行;

3)  静态代码块执行过一次以后,再创建新对象时,静态代码块不再执行;

4)  代码块每创建一次新对象,都会随着类而加载执行。

 

 

06天-10-面向对象(单例设计模式)

l  Java中有23中设计模式。

l  第一种:单例设计模式。解决一个雷在内存中只存在一个对象。

1)   怎样保证对象的唯一性?

a.  为了避免其他程序过多创建该类对象,先禁止其他程序建立该类对象;

b.  为了能让其他程序可以访问到该类对象,只好在本类中自定义一个对象;

c.  为了方便其他程序自定义对象的访问,可以对外提供一些访问方式。

2)   这三部怎样用代码体现呢?

a.  将构造函数私有化;

b.  在类中创建一个本类对象;

c.  提供一个方法可以获取到该对象。

3)   单例设计模式创建的第一种方式:饿汉式。

class Single{

    privatestatic Single s = new Single();//静态关键字不能省略

    privateSingle(){

 

}

public static Single getInstatce(){

    return s;

}

}

4)   单例设计模式的第二种方式:懒汉式。对象是方法调用时,才初始化,也叫做对象的延时加载,成为:懒汉式。

class Single{

    privatestatic Single s = null;

    privateSingle(){}

    privatestatic Single getInstance(){

    if(s==null){

    synchronized(Single.class){

    if(s==null){

    s = newSingle();

}

}

}

return s;

}

}

 

记录原则:定义单例,建议用饿汉式。