Java语言特性
1 Java语言特性与Java程序运行过程
Java是一门面向对象的编程语言,通过在不同的平台搭建Java虚拟机JVM实现跨平台运行的特性。
Java程序运行时,通过编译器将.java文件编译成.class文件到达JVM,JVM为java程序分配运行时数据区,JVM解释一行字节码文件CPU执行一行字节码文件,既可以说Java是编译型语言,也可以说是解释型语言。
2 Java面向对象特性
2.1 Java对象和类
Java程序的基本单位是对象。而对象是类的实例。
类抽取了结构相似的对象的相同点归结为类,每个对象都是某种类的一个实例。
类中成员有:
- 域(类变量)
- 初始化代码块(静态初始化代码块、普通初始化代码块)
- 方法(普通方法、构造方法)
- 内部类(内部类、内部枚举、内部接口)
类的示例:
class Test {
// 1. 域
int fieldOne; // 非静态,需类被实例化后才能初始化,存储在Java运行时数据区的堆
static int fieldTwo; // 静态域,存储在Java运行时数据区的方法区中
// 2. 初始化代码块
{
fieldOne = 1; // 普通代码块,需类被实例化后才能初始化存储在Java运行时数据区的堆
}
static {
fieldTwo = 2; // 静态代码块,类被加载进JVM时初始化,存储在Java运行时数据区的方法区中
}
Test() {} // 构造方法
void methodOne() {} //普通方法,存储在Java运行时数据区的方法区中
static void methodTwo() { } //静态方法,存储在Java运行时数据区的方法区中
// 3.1 内部类
class InnerClass {
int innerClassField;
}
// 3.2 内部枚举
enum InnerEnum {
ENUM_FIELD_ONE("A"),
ENUM_FIELD_TWO("B"),
ENUM_FIELD_THREE("C");
String enumField;
InnerEnum(String enumField) {
this.enumField = enumField;
}
}
// 3.3 内部接口
public interface InnerInterface {
void methodOne();
void methodTwo();
}
}
运行时数据区,主要为:
- 方法区,存放(被JVM加载的)类信息,常量、静态变量
- 堆,存放对象,引用(类中的引用),线程共享
- Java虚拟机栈,方法执行时创建栈帧,存储局部变量、引用(方法局部变量引用)
类可以被类继承,继承后,子类拥有所有类成员,但对类成员的访问会被父类的成员的权限限定关键词所限制:
- private,只有本类可以访问,子类不能访问,同包不能访问
- 默认,包内可以访问
- protected,包内可以访问,子类可以访问
- public,不同包也可以访问
延申:
- main方法、static修饰的域和方法不需要实例化类即可调用
- 非main且非静态方法(即构造方法和普通方法)必须要先实例化一个对象才能被调用
- 权限修饰符中protected权限大于默认(包外也可能被访问)
protected示例:
- 父类Test.java:
package hi;
public class Test {
protected int fatherProtectedField;
protected Test() {
fatherProtectedField = 1;
}
}
- 子类Test2.java:
package hello;
import hi.Test;
public class Test2 extends Test {
Test2() {
fatherProtectedField = 2; // 访问成功,原因:构造方法属于对象,对象实例化时会先实例化父类对象的域
}
void method() {
fatherProtectedField = 3; // 同上
}
public static void main(String[] args) {
fatherProtectedField = 4; // 访问失败。原因:main方法的执行没有实例化本类
new Test2().fatherProtectedField = 4;
}
}
引用:
引用,Java程序运行时,用于存储对象在堆中的地址。
引用可以访问对象的内容,使用操作符"."。
在运行时数据区中,引用可存放在堆中,也可存在Java虚拟机栈中。
多态:
父类引用指向子类对象,调用引用的方法的时候,根据具体指向的对象调用具体的方法。
封装和抽象:
封装的体现:
- 对象对外屏蔽内部结构,通过引用调用对象提供的对外方法
抽象的体现:
- 抽取结构相似的对象的相同点归结为类