1.例如:我们创造一个人的类,我们希望他是中国人类,所以我们希望所有对象都共有中国人的属性;

import org.w3c.dom.ls.LSOutput;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Chinese c1 = new Chinese(25, "zhangsan");
Chinese c2 = new Chinese(30, "lisi");
c1.nation = "Chinese";
System.out.println(c2.nation);
}
}
class Chinese{
public Chinese(int age, String name){
this.age = age;
this.name = name;
}
int age;
String name;
static String nation;
}
2.static可以修饰:
属性、方法、代码块、内部类;
(1)static修饰属性:多个对象共用一个,修改一个,会导致其他对象的该属性改变
说明:
①静态变量随着类的加载而加载,可以通过"类.静态变量"的方式调用;
②静态变量的加载早于对象的创建
③由于类只会加载一次,所以内存中只存在一份静态变量,存在于方法区的静态域中;

(2)static修饰方法:
①随着类的加载而加载,可以通过"类.静态方法"的方式进行调用;
②静态方法中,只能调用静态的属性和方法;
非静态方法中,都行;
3.注意点:静态方法中,不能使用this、super关键字;
开发中:一般工具类中的方法会声明为static方法;
4.单例设计模式:

单例模式分为两类:
饿汉式:
class Bank{
private Bank(){
}
private static Bank b1 = new Bank();
public static Bank getBank(){
return b1;
}
}
懒汉式:
import org.w3c.dom.ls.LSOutput;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
}
}
class Order{
private Order(){
}
private static Order o1 = null;
public static Order getOrder(){
if(o1 == null){
o1 = new Order();
return o1;
}else {
return o1;
}
}
}
两种方式的对比:
饿汉式:
坏处:加载对象时间过长
好处:线程安全
懒汉式:
坏处:线程不安全;
单例模式的优点:
由于单例模式只产生一个实例,减少了系统性能开销,当一个对象产生需要比较多资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时产生一个单例对象,然后永久驻留内存的方式来解决;

5.代码块:
作用:初始化类、对象
修饰符:static
分为静态代码块和非静态代码块:
(1)静态:随着类的加载而执行,只会执行一次;初始化类的信息;静态代码块中只能调用静态属性和方法;同时多个,则按顺序执行
(2)非静态:随着对象的创建而执行;每创建一次就执行一次,可以对对象的属性进行初始化
import org.w3c.dom.ls.LSOutput;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String s1 = Person.desc;
}
}
class Person{
String name;
int age;
static String desc = "我是一个人";
public Person(){}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
static {
System.out.println("hello, static block");
}
{
System.out.println("hello, block");
}
}
会触发静态代码块运行;
import org.w3c.dom.ls.LSOutput;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
}
}
class Person{
String name;
int age;
static String desc = "我是一个人";
public Person(){}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
static {
System.out.println("hello, static block");
}
{
System.out.println("hello, block");
}
}
会同时触发两个代码块;
import org.w3c.dom.ls.LSOutput;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println(Person.desc);
}
}
class Person{
String name;
int age;
static String desc = "我是一个人";
public Person(){}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
static {
System.out.println("hello, static block");
desc = "我是静态";
}
{
System.out.println("hello, block");
}
}
6.对对象可以赋值的位置:
(1)默认初始化
(2)显式赋值/代码块中赋值
(3)构造器赋值
(4)调用赋值
顺序:1-2-3-4
7.关键词final:最终的:
可以修饰的结构:类、方法、变量
(1)修饰类:不能被继承
(2)修饰方法:不能被重写
(3)修饰变量:此时的变量就称为一个常量:
①修饰属性:赋值位置:显式、构造器、代码块
②修饰局部变量:尤其形参时,在方法体内不能对形参重新赋值;