1、static关键字
1.1、如果您想共享一个成员变量被类的所有实例,可以使用static进行修改。它属于类中没有一个对象,称为类变量。
例如,每个中国人的国籍都属于中国,所以没有必要为每个中国人的对象创造一个国籍属性。
1.2、类中的方法只能通过类实例调用,但有时我们可以在不创建对象的情况下调用类中的方法。这种方法,我们称之为类法,需要在类声明中添加static关键字。
1.3、static可修改的结构:属性、方法、代码块、内部类。
==注:静态方法不能调用非静态变量,但非静态方法可以调用静态变量或静态方法,调用时应通过类调用。不建议使用对象调用(也不能使用this调用相关的静态属性或方法,因为this只有在对象创建后才能有,但是静态成员变量或者方法属于整个类。它不属于特定的对象,因此不能这样调用。)==
如下代码所示:
Chinese类:
public class Chinese { private static String guoJi = "中国!"; String name; int age; public Chinese() { } public Chinese(String guoJi, String name, int age) { this.guoJi = guoJi; this.name = name; this.age = age; } /** * 获取 * * @return guoJi */ public static String getGuoJi() { return guoJi; } /** * 设置 * * @param guoJi */ public static void setGuoJi(String guoJi) { Chinese.guoJi = guoJi; } /** * 获取 * * @return name */ public String getName() { return name; } /** * 设置 * * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * * @return age */ public int getAge() { return age; } /** * 设置 * * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Chinese{guoJi = " + guoJi + ", name = " + name + ", age = " + age + "}"; } ///静态方法 public static void showInformation(){ System.out.println("我的国籍:" + Chinese.guoJi); } }
测试类:
public class ChineseTest { public static void main(String[] args) { Chinese chinese = new Chinese(); chinese.showInformation(); ///不建议这样调用 ///应该通过类调用 Chinese.showInformation(); }}
输出结果:
我的国籍:中国!我的国籍:中国!
在jdk7之前,静态变量存储在方法区,在jdk7之后,静态变量存储在堆积区。静态变量的消亡时间随类卸载而消亡。
1.4、静态变量何时需要使用?
①、判断当前类别的多个例子是否可以共享成员变量,共享成员变量的值是相同的,因为一旦修改静态变量,整个类别将被修改。
②、在开发过程中,一些常量声明往往是静态的,比如Math中的PI
1.5、静态方法何时需要使用?
①、如果方法中操作的变量是静态变量(而不是实例变量),则该方法建议声明为静态方法。
②、在开发过程中,工具类中的方法被声明为静态方法。
2、单例设计模式及对main的理解2.1、设计模式是在大量实践中总结和理论化后首选的代码结构、编程风格和解决问题的思维方式。就像经典的国际象棋乐谱一样,不同的国际象棋游戏,我们使用不同的国际象棋乐谱来解决游戏。所谓的单一案例设计模式是为了确保在整个软件系统中只有一个对象的例子,而这类只提供一个获取对象的例子的方法。
2.2、实现类单例设计模式的思路:将类的结构器权限设置为private,需要通过类来调用类中的静态方法才能获得类中的东西。
饿汉单例模式:
public class Person1 { private static Person1 person1 = new Person1(); private Person1() //返回对象 public static Person1 getPerson1({ return person1; }}
懒汉单例模式:
public class Person2 { private static Person2 person2 = null; //获取对象 public static Person2 getperson2() { if (person2 == null) { person2 = new Person2(); } return person2; }}
两种写法的优缺点:
饿汉风格:(优点)写法简单。因为内存加载早,使用更方便快捷,线程安全。(缺点)内存占用时间长。==建议使用这种方法。==
懒汉风格:(优点)调用时再创建,内存占用较低。(缺点)线程不安全。
2.3、main方法
2.3.1、用static装饰,表名main法随类加载而加载。
2.3.2、形参的作用:与控制台交互
3、代码块(初始化块)3.1、代码块的修改:只能使用static进行修改,也可以不使用。因此分为静态代码块和非静态代码块。
如下所示:
Person3类:
public class Person3 { public Person3() { } public String toString() { return "Person3{}"; } ///静态代码块 static { System.out.println("我是静态代码块!"); } ///非静态代码块 { System.out.println("我是非静态代码块!"); } ///非静态代码块 { System.out.println("我是非静态代码块!"); } public void show() { System.out.println("我在吃饭!"); }}
测试类:
public class MyTest { public static void main(String[] args) { Person3 person3 = new Person3(); person3.show(); }}
输出结果:
我是静态代码块!我是非静态代码块!我在吃饭!
静态代码块(用于初始化的信息)只执行一次,而不是创建一个对象的静态代码块(用于初始化对象的信息)。静态代码块的调用方式与静态代码块相同。
四、类中属性赋值的位置和过程1、非静态属性赋值的位置有:
①、默认初始化
②、显式初始化或代码块初始化
③、构造中的初始化
④、拥有对象后,变量赋值通过方法进行
2、如何在开发中选择上述赋值方法?
五、final关键词①、当不同对象中的属性相同时,使用显式初始化。
②、当不同对象中的属性不同时,使用构造器进行初始化。
③、代码块中通常会赋值静态变量。
1、可以修改final关键字的结构:类别、方法、变量。
1.1、final修饰类,表示该类不能继承。
如下所示:
final public class Person { public void show(){ System.out.println("我是父类"); }}下面的写法是错误的,Final修改的类别不能继承class Person1 extends Persson{ }
1.2、final修改方法表明该方法不能重写。
public class Person { public final void show(){ System.out.println("我是父类"); }}
1.3、final修改变量意味着变量已成为常量。一旦赋值,就不能修改(当变量作为局部变量时,可以先声明,然后赋值,只要在使用前赋值,作为形参时不能修改),类似于C++中的const。
1.4、final成员变量赋值的地方有哪些?
①、显式赋值
②、代码块赋值
③、在结构中赋值
1.5、final和static的混合:表示静态常量,如PInal