Java高级特性

Java高级特性

Static关键字

  1. 静态变量(Static Variables)
    • static 修饰一个成员变量时,这个变量就成为静态变量,也称为类变量。静态变量存储在Java方法区中,且仅有一个副本,供所有类的实例共享
    • 静态变量在类加载时初始化,其生命周期贯穿整个程序执行过程,直到JVM停止运行(类似于全局变量)
    • 可以通过类名直接访问静态变量,无需创建类的实例
  2. 静态方法(Static Methods)
    • 静态方法也是属于类而不属于类的任何对象,因此可以通过类名直接调用,不需要实例化对象
    • 静态方法内不能直接访问非静态成员(变量或方法),因为非静态成员必须依赖于具体的对象存在。比如main()方法
    • 静态方法中不能使用 thissuper 关键字,因为没有指向任何对象的引用
    • 静态方法适合于那些不依赖于对象状态的操作,如工具类中的方法

抽象类和接口

抽象类:

​ 只有声明而没有方法体的方法称为抽象方法,而包含一个或多个抽象方法的类称为抽象类,抽象类(Abstract Class)是一种特殊的类。必须在声明中增加 abstract 关键字,在无方法体的方法前也要加上abstract

  • 抽象类也可有构造方法、普通的成员变量或方法,也可以派生子类。
  • 抽象类不能直接用来生成实例(即使是普通类前面添加abstract修饰)。
  • 一般可通过定义子类进行实例化可以生成抽象类的变量,该变量可以指向具体的一个子类的实例
  • 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同、但是本质上相同的具体概念的抽象
  • 抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在
  • 如果一个类想实例化,那他必须重写所有父类的抽象方法

接口:

​ 接口是在抽象类概念的基础上演变而来的。

  • 在接口中定义的常量默认具有public,final,static的属性。
  • 在接口中声明的方法默认具有public,abstract的属性。
  • 接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(Java SE 8开始能在接口中实现方法)
  • 因而,接口定义了一组行为的协议,两个对象之间通过这个协议进行通信
  • 接口在面向对象的 Java 程序设计中占有举足轻重的地位。事实上在设计阶段最重要的任务之一就是设计出各部分的接口,然后通过接口的组合,形成程序的基本框架结构
  • 接口不属于类层次结构。不相关的类可以实现相同的接口
  • implements代替extends声明子类,该子类中必须实现接口(及其超类)中的所有方法
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public interface CanFly {
void fly();
}

public interface CanSwim {
void swim();
}

public abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void eat();
public abstract void sleep();
}

public abstract class Mammal extends Animal implements CanFly {
public Mammal(String name) {
super(name);
}
public abstract void careForYoung();
public abstract void fly();
}

public class Bird extends Mammal implements CanSwim {
public Bird(String name) {
super(name);
}

public void careForYoung() {
System.out.println(name + " cares for its young.");
}

public void eat() {
System.out.println(name + " eats.");
}

public void sleep() {
System.out.println(name + " sleeps.");
}

public void fly() {
System.out.println(name + " flies.");
}

public void swim() {
System.out.println(name + " swims.");
}
}

package语句

​ 包(package)是相关类与接口的一个集合,它提供访问控制与命名空间管理,Java平台中的类与接口都是根据功能以包组织的。

包机制的好处:

  • 程序员容易确定包中的类是相关的,并且容易根据所需的功能找到相应的类

  • 每个包都创建一个新的命名空间,因此不同包中的类名不会冲突

  • 同一个包中的类之间有比较宽松的访问控制

包成员的使用import

​ 将package引入源程序,格式为:

1
2
import  包名.*;
import 包名. 类名;
  • import语句必须在源程序之前,在package声明之后
1
2
3
[package ……]   //缺省是package . 
[import ……] //缺省是import java.lang.*
[类声明 ……]
  • 引入其他类的静态成员:
1
2
import  static ……
import static java.lang.Math.*;

包名与包中类的存储位置

  • 包分隔符相当于目录分隔符,包存储的路径由包根路径加上包名指明的路径组成。

  • 包的根路径由CLASSPATH环境变量指出。

1
2
package abc.financeDept
%CLASSPATH%\abc\financeDept

枚举类型

1
2
3
4
[public] enum 枚举类型名 [implements 接口名表] {
枚举常量定义
[枚举体定义]
}
  • 枚举类型与类一样,也可以实现接口。

  • 所有的枚举类型都隐含地继承了java.lang.Enum类,由于Java不支持多继承,所以枚举类型的声明中不能再继承任何类

  • 枚举类型实际上是具有固定实例的特殊类

  • 每个枚举常量都将与一个整数值相对应

  • 枚举类型的构造方法只能定义为private(默认)

  • 枚举类型的方法:

1
2
3
4
5
equals:如果传入对象等于此枚举常量时,返回true
name:返回此枚举常量的名称,在其枚举声明中对其进行声明
ordinal:返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
toString:返回枚举常量的名称,它包含在声明中
values:返回一个包含该枚举类型所有常量的数组
  • 枚举类型的变量也属于一种引用型变量

Wrapper类

  • Wrapper将基本类型表示成类

  • 每个Wrapper类对象都封装了基本类型的一个值

Primitive Data Type Wrapper Class
boolean Boolean
byte Byte
char Character
short Short
int Integer
long Long
float Float
  • Wrapper类中包含了很多有用的方法和常量,如数字型Wrapper类中的MIN_VALUE 和 MAX_VALUE 常量,定义了该类型的最大值与最小值。byteValue, shortValue方法进行数值转换,valueOf 和 toString 实现字符串与数值之间的转换

自动装箱与拆箱

  • 装箱(Box):把基本类型的数据通过相应Wrapper类形成对象

  • 拆箱(Unbox):把一个Wrapper类对象中的基本数据类型提取出来

  • 自动装箱与拆箱

1
2
Integer i = 10;
int j = i;