static关键字
1:如果没有static会怎样?
1:定义Person类
1:姓名、年龄、国籍,说话行为
2:多个构造,重载形式体现
2:中国人的国籍都是确定的
1:国籍可以进行显示初始化

1 class Person { 2 String name; 3 int age; 4 String gender; 5 String country = "CN"; 6 7 Person() { 8 9 } 10 11 Person(String name, int age, String gender, String country) { 12 this.name = name; 13 this.age = age; 14 this.gender = gender; 15 this.country = country; 16 } 17 18 void speak() { 19 System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender + " 年龄:" + age + " 哈哈!!!"); 20 } 21 22 }
3:new Person 对象
1:分析内存
2:每个对象都维护实例变量国籍也是。

1 public class PersonDemo { 2 public static void main(String[] args) { 3 Person p1 = new Person("jack", 20, "男"); 4 p1.speak(); 5 6 Person p2 = new Person("rose", 18, "女"); 7 p2.speak(); 8 } 9 }
4:内存分析
1:栈,堆、共享区
2:Demo.class加载近共享区
1:Demo类的main方法进栈
2:Person p1=new Person();
1:Person.class 加载进方法区
2:堆内存开辟空间,实例变量进行默认初始化,显示初始化。
3:内存地址传给变量p1,栈和堆建立连接
3:person p2=new Person();
1:堆内存开辟空间,实例变量进行默认初始化,显示初始化。
2:内存地址传给变量p2,栈和堆建立连接
4:如果建立多个Person对象发现问题
1:每个对象都维护有国籍。
5:解决问题,内存优化
1:为了让所有Person对象都共享一个country ,可以尝试将country放入共享区。
2:country变量如何放入共享区?对象如何访问?
1:使用static
2:static
1:为了实现对象之间重复属性的数据共享
3:static使用
1:主要用于修饰类的成员
1:成员变量
1:非静态成员变量:需要创建对象来访问
2:静态成员变量:使用类名直接调用,也可以通过对象访问

1 public static void main(String[] args) { 2 3 //访问静态成员 4 //直接通过类名来调用 5 String country=Person.country; 6 System.out.println(country); 7 8 //通过对象.成员的形式访问 9 Person p1 = new Person("jack", 20, "男"); 10 p1.country="US"; 11 p1.speak(); 12 13 } 14 class Person { 15 String name; 16 int age; 17 String gender; 18 //static 修饰成员变量 19 static String country = "CN"; 20 21 Person() { 22 23 } 24 25 Person(String name, int age, String gender) { 26 this.name = name; 27 this.age = age; 28 this.gender = gender; 29 30 } 31 32 void speak() { 33 34 System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender 35 + " 年龄:" + age + " 哈哈!!!"); 36 } 37 38 }
2:成员方法
可以使用类名直接调用
1:静态函数:
1:静态函数中不能访问非静态成员变量,只能访问静态变量。
2:静态方法不可以定义this,super关键字.
3:因为静态优先于对象存在.静态方法中更不可以出现this
2:非静态函数:非静态函数中可以访问静态成员变量

1 class Person { 2 String name; 3 int age; 4 String gender; 5 //static 修饰成员变量 6 static String country = "CN"; 7 8 Person() { 9 10 } 11 12 Person(String name, int age, String gender) { 13 this.name = name; 14 this.age = age; 15 this.gender = gender; 16 17 } 18 //非静态方法 19 void speak() { 20 //非静态方法可以访问静态成员 21 System.out.println("国籍:" + country ); 22 23 System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender 24 + " 年龄:" + age + " 哈哈!!!"); 25 26 } 27 //静态方法 28 static void run(){ 29 //静态方法只能访问静态成员变量。 30 System.out.println("国籍:"+country); 31 32 //静态方法访问非静态成员变量,编译报错。 33 System.out.println(" 姓名:" + name); 34 35 //静态方法中不可以出现this,编译报错 36 this.speak(); 37 } 38 }
2:细节:
1:静态函数中不能使用非静态变量
2:非静态函数可以访问静态变量
3:为什么静态函数中不能访问非静态成员
1:static修饰的成员在共享区中。优先于对象存在
2:验证
1:使用静态代码块验证
1:静态代码块
static{
静态代码块执行语句;
}
1:静态代码块特点
随着类的加载而加载。只执行一次,优先于主函数。用于给类进行初始化。

1 public class PersonDemo { 2 public static void main(String[] args) { 3 4 // 访问静态成员 5 // 直接通过类名来调用 6 String country = Person.country; 7 System.out.println(country); 8 9 // 通过对象.成员的形式访问 10 Person p1 = new Person("jack", 20, "男"); 11 p1.country = "US"; 12 p1.speak(); 13 14 } 15 } 16 17 18 class Person { 19 String name; 20 int age; 21 String gender; 22 // static 修饰成员变量 23 static String country = "CN"; 24 static { 25 System.out.println("这是静态代码块"); 26 } 27 28 { 29 System.out.println("这是构造代码块"); 30 } 31 32 Person() { 33 System.out.println("无参数构造"); 34 } 35 36 Person(String name, int age, String gender) { 37 this.name = name; 38 this.age = age; 39 this.gender = gender; 40 System.out.println(" 有参数构造"); 41 42 } 43 44 // 非静态方法 45 void speak() { 46 // 非静态方法可以访问静态成员 47 System.out.println("国籍:" + country); 48 49 System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender 50 + " 年龄:" + age + " 哈哈!!!"); 51 // 非静态方法可以调用静态方法。 52 run(); 53 } 54 55 // 静态方法 56 static void run() { 57 // 静态方法只能访问静态成员变量。 58 System.out.println("国籍:" + country); 59 } 60 }
4:static特点
`````1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。
2 优先于对象存在。-->静态是先存在,对象是后存在。
3 被所有实例(对象)所共享。
4 可以直接被类名调用
5:静态变量(类变量)和实例变量的区别:
1存放位置
1:类变量随着类的加载而加载存在于方法区中.
2:实例变量随着对象的建立而存在于堆内存中.
2生命周期
1:类变量生命周期最长,随着类的消失而消失.
2:实例变量生命周期随着对象的消失而消失.
6:静态优缺点
1: 优点:对对象的共享数据进行单独空间的存储,节省空间 例如Person 都有
国籍。该数据可以共享可以被类名调
2:缺点:生命周期过长
访问出现局限性。(静态只能访问静态)
访问出现局限性。(静态只能访问静态)
7: 什么时候定义静态变量
1:静态变量(类变量)当对象中出现共享数据
例如:学生的学校名称。学校名称可以共享
对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)
对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)
8:什么时候定义静态函数
如果功能内部没有访问到非静态数据(对象的特有数据。那么该功能就可以定义为静态)
9:静态的应用
自定义数组工具类
main方法详解
主函数是静态的
public static void main(String[] args){
}
主函数是什么:主函数是一个特殊的函数,作为程序的入口,可以被jvm识别。
主函数的定义:
public :代表该函数的访问权限是最大的。
static :代表主函数随着类的加载,就已经存在了。
void: 主函数没有具体的返回值
main : 不是关键字,是一个特殊的单词可以被jvm识别。
(String[] args) 函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
主函数的格式是固定的:jvm能够识别
jvm在调用函数是,传入的是new String[0];
可以在dos窗口中执行 java Demo5 hello world 给类Demo5的main方法传递2个参数,参数与参数之间通过空格隔开。

1 class Demo5 { 2 3 public static void main(String[] args) { 4 5 // 获取String[] args 数组长度 6 System.out.println(args.length); 7 8 // 变量args数组 9 for (int x = 0; x < args.length; x++) { 10 System.out.println(args[x]); 11 } 12 } 13 14 } 15 16 class MainTest { 17 18 public static void main(String[] args) { 19 // 字符串数组 20 String[] arr = { "good", "study", "java" }; 21 22 // 调用Demo5类的main方法,传递参数。 23 Demo5.main(arr); 24 25 } 26 }
单例设计模式
一些人总结出来用来解决特定问题的固定的解决方案。
解决一个类在内存中只存在一个对象,想要保证对象的唯一。
1 为了避免其他程序过多的建立该类对象。禁止其他程序建立该类对象。
2 为了其他程序可以访问该类对象,在本类中自定义一个对象。
3 方便其他程序对自定义类的对象的访问,对外提供一些访问方式。
代码:
1将构造函数私有化
2在类中创建一个私有的本类对象
3提供一个用类名调用的公有方法获取该对象。

1 class Single { 2 3 private static Single s = new Single(); // 恶汉式 4 5 private Single() { 6 7 } 8 9 public static Single getInstance() { 10 return s; 11 } 12 } 13 14 class Single2 { 15 private static Single2 s = null; // 懒汉 16 17 private Single2() { 18 19 } 20 21 public static Single2 getInstance() { 22 if (s == null) { 23 s = new Single2(); 24 } 25 return s; 26 } 27 }