跳转至

面向对象(三)

一、关键字的使用

1. packages

  1. 为了更改的实现项目中类的管理。
  2. 使用packages声明类或接口所属的包,声明在源文件的首行。
  3. 包属于标识符,遵循标识符的命名规则和规范。
  4. .一次,代表一层文件目录
  5. 同一个包下不能命名同名的接口、类。

2. import

  1. 在源文件中显式的使用import结构导入指定包下的类、接口。
  2. 声明在包的声明和类的声明之间。
  3. 如果需要导入多个结构,并列写出即可。
  4. 可以使用xxx.*的方式,表示导入xxx包下的所有结构。
  5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构。
  6. 如果在源文件中使用了不同包下同名的类,则必须至少有一个类使用全类名的方式显示。
  7. 使用xxx.*可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需要导入。

3. static

用来修饰属性、方法、代码块、内部类

3.1 修饰属性

属性按照是否使用static修饰,分为静态属性(类变量)和非静态属性(实例变量)。

  1. 实例变量:当创建了类的多个对象,每个对象独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时不对导致其他对象中同样属性值的修改。

  2. 静态变量:当创建了类的多个对象,多个对象共享同一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时是修改过的。

静态变量随着类的加载而加载。可以通过类.静态变量的方法进行调用。

静态变量的加载早与对象的创建。

静态变量在内存中只会存在一份,存在方法区的静态域中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class StaticTest {
    public static void main(String[] args) {
        System.out.println(Chinese.nation);  // null

        Chinese c1 = new Chinese();
        c1.nation = "CHN";
        System.out.println(c1.nation);  // CHN
        Chinese c2 = new Chinese();
        System.out.println(c2.nation);  // CHN
    }
}

class Chinese{
    static String nation;
}

3.2 修饰方法

随着类的加载而加载,可以通过类.静态方法的方式调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class StaticTest {
    public static void main(String[] args) {
        Chinese.show();
    }
}

class Chinese {
    public static void show() {
        System.out.println("Hello, China");  // Hello, China
    }
}

静态方法中只能调用静态的方法或属性,非静态方法中,既可以调用非静态的方法和属性也可以调用静态的方法和属性。

3.5 单例模式

1. 饿汉式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();
        System.out.println(bank1 == bank2);  // true
    }
}


class Bank{
    // 1. 私有化类构造器
    private Bank(){
    }
    // 2. 内部创建类对象
    // 4.要求此对象必须声明为静态的
    private static Bank instance = new Bank();

    // 3. 提供公共的静态方法返回类的对象
    public static Bank getInstance(){
        return instance;
    }

}
2. 懒汉式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();
        System.out.println(bank1 == bank2);  // true
    }
}


class Bank {
    // 1. 私有化类构造器
    private Bank() {
    }

    // 2. 声明当前类对象,没有初始化
    // 4. 此对象也必须声明为static
    private static Bank instance = null;

    // 3. 提供公共的静态方法返回类的对象
    public static synchronized Bank getInstance() {  // synchronized 线程安全
        if (instance == null) {
            instance = new Bank();
        }
        return instance;
    }

}

饿汉式和懒汉式的区别:

懒汉式:延迟对象的创建

饿汉式:对象加载时间过长,线程安全的

引用场景:

  1. 网站的计数器
  2. 应用程序的日志应用
  3. 数据库连接池
  4. 读取配置文件的类

4. final

用来修改结构、类、方法、变量

4.1 修饰类

1
final class TestClass{}

用来修饰一个类,此类不能被其他类所继承。比如:String类、System类、StringBuffer类等。

4.2 修饰方法

1
public final void func(){}

用来修饰方法,表名此方法不可以被重写。比如Object中的getClass()

4.3 修饰变量

1
final int COUNT = 10;

用来修饰变量,此时的“变量”就称为一个常量

  1. 修饰属性:在显示初始化、代码块中、构造器中赋值
  2. 修饰局部变量:修饰形参时,表示此形参是一个常量,当调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。

static final用来修饰属性:全局常量

二、JavaBean

符合如下标准的Java类:

  1. 类是公共的
  2. 有一个无参的公共构造器
  3. 有属性,且有对应的get、set方法