Java 基础

前文回顾『小闫陪你入门 Java (一)』

5.常量

Java 中设置常量有些特殊,并不像 Python 中直接赋值即可,需要利用关键字 final 指示。如下:

final double CONSTANT = 2.65

注意:使用关键字 final 修饰的常量不能被修改,只能用一次。而且常量名一般全使用大写。

与变量一致,常量也可以设置类常量,将其定义在 main 方法的外部,可以供类内所有方法使用。形式如下:

public static final double CONSTANT = 2.65

const 是 Java 保留的关键字,因此自己不可使用。

6.Java 修饰符

Java 的修饰符是用来定义类、方法或者变量的关键字,通常放在语句的最前端。主要分为两类,一类是访问修饰符,一类是非访问修饰符。

6.1 访问控制修饰符

default:此修饰符为默认访问修饰符(不使用修饰符的情况下,默认为此修饰符)。使用默认访问修饰符声明的变量和方法,对在同一个包内的类是可以使用访问的。同时,此接口中的变量都默认声明为 publicstaticfinal,方法则默认权限为 public

String version = "1.1.0";
boolean processOrder() {
   return true;
}

private:此修饰符为私有访问修饰符。它声明的方法、构造方法和变量都只能被所在的类内访问。声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问,而且类和接口不能声明为 private 。

私有访问修饰符是为了安全起见,保护私有内容不被访问,从而泄漏代码。

public:此修饰符为公有访问修饰符。被它声明的类、方法、构造方法和接口都能被其他任何类访问。如果需要使用其他包内的类,那么就需要导入了。还有一点,类所有的公有方法,都如同 Python 一样,可以被其子类继承。

Java 中的 main() 方法必须设置成共有的,否则解释器不能运行。

protected:此修饰符为受保护的访问修饰符。此修饰符需分两种情况来分析说明:第一种是子类和基类在同一个包中时,包中的类可以访问任何声明为 protected 的方法、构造器和变量等;第二种是子类和基类不在同一包中时,子类实例对象可以访问其从基类继承的被声明为 protected 方法,而不能访问基类实例对象的 protected 方法。有点绕,好好理解一下。

protected 可以修饰数据成员、构造方法和方法,但是不能修饰类,当然,内部类不算。接口和接口的成员变量以及成员方法不能声明为 protected。

详解可看文章https://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html

访问控制和继承

1.父类中声明为 public 的方法在子类中也必须为 public。

2.父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。

3.父类中声明为 private 的方法,不能够被继承。

6.2 非访问修饰符

1. static 修饰符,用来修饰类方法和类变量。

2. final 修饰符,用来修饰类、方法和变量。final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

final 修饰符通常和 static 修饰符一起使用来创建类常量。

3. abstract 修饰符,用来创建抽象类和抽象方法。

一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

4. synchronized 和 volatile 修饰符,主要用于线程的编程。

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

抽象类和抽象方法

抽象类顾名思义,是抽象的,不能创建实例对象。它存活的唯一理由就是为了将来对该类进行扩充。抽象类中可以包含抽象方法也可以包含非抽象方法。如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

抽象方法就是没有实现,只是有这么个方法,具体实现在子类中书写。抽象方法不能被声明成 final 和 static。任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。抽象方法的声明以分号结尾,例如:

public abstract sample();