Java_SE_Lesson_3:接口、单例模式、包与访问控制
-
接口中所声明的方法都是抽象方法。接口中的方法都是
public
的。 -
接口中也可以定义成员变量。接口中的成员变量都是
public
,final
,static
的。 -
一个类不能既是 final 又是 abstract 的。因为 abstract 的主要目的是啥定义一种约定,让子类去实现这种约定,而 final 表示该类不能被继承。
这样 abstract 希望该类可以被继承而 final 明确说明该类不能被继承,两者矛盾。
因此一个类不能既是 final 的又是 abstract 的。
-
Desgin Pattern(设计模式)。
单例模式(Singleton)
public class SingletonTest { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2); } } class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } }
或者
public class SingletonTest {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}
class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
}
注意:方式二,在多线程的时候,可能会出现线程不安全,不是单例的情况。
- 包(
package
)
用于将完成不同功能的类分门别类,放在不同的目录(包)下。
包命名规则:将公司域名反转作为包名。
www.terwer.space,包名:space.terwer
对于包名:每个字母都是小写。
如果定义类的时候,没有使用 package,那么 Java 认为我们的包位于默认的包里面(default package)。
-
编译带有 package 声明的 java 源文件有两种方式
a)直接编译,然后根据类中所定义的包名,逐一手工建立目录结构,最后将生成的 class 文件拷贝该目录(较麻烦,很少使用)。
b)使用编译参数
-d
,方式为javac -d . 源文件.java
,这样编译后,编译器会自动帮我们建立好包对应的目录结构。 -
有两个报名。分别是 aa.bb.cc 与 aa.bb.cc.dd,那么我们称后者为前者的子包。
-
导入(
import
):将使用 package 分离的各个类导入回来,让编译器能够找到所需的类。 -
import 的语法:
import space.terwer.PackageTest;
-
import space.terwer.*
,博士导入 space.terwer 包下面的所有类。 -
import aa.bb.*
并不会导入 aa.bb.cc 包下面的类。这样写:
import aa.bb.*; import aa.bb.cc,*;
-
关于 package、import、class 的顺序问题:
a)首先要定义包(package),可选
b)接下来使用 import 进行导入,可选
c)然后才是 class 或者 interface 的定义。
-
如果两个类在同一个包下面,那么不需要导入,直接使用即可。
-
访问修饰符(access modifier)
1)public(公共的):被 public 修饰的属性和方法可以被所有类访问。
2)protected(受保护的):被 protected 修饰的属性和方法可以在类内部、相同包以及该类额子类所访问。
3)private(私有的):被 private 修饰的属性和方法只能在定义该属性和方法的类的内部使用。
4)默认(不加访问修饰符):在类内部以及相同包下面的类所使用。
-
instanceof:判断某个对象是否是某个类的实例。用法:
引用名 instanceof 类名(接口名)
,返回一个 boolean 值。 -
People people = new Man();
-
System.out.println(people instanceof People);// 结果为true
因为 Man 是 People 的子类,因此 Man 可以看做是 People 的实例。
文章更新历史
2022-10-10 feat:初稿。