1 package、import 和 import static
1.1 Package
Java 引入了包(Package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理问题。Java 允许将相关的类放在同一个 package 下,从而组成逻辑上的类库单元。如果希望把一个类放在指定的包结构下,应该在 Java 源代码的第一个非注释行放置如下格式代码:
package packageName;
位于包中的每个类的完整类名都应该是包命和类名的组合,如果其他人需要使用该包下的类,也应该使用完整类名。
用命令行编译时,用 javac -d . xxx.java 会生成包层次相同的目录结构。
位于包中的类,在文件系统中也必须有与包命层次相同的目录结构。推荐用上述方法编译。
一个源文件只能指定一个包,只能包含一条 package 语句。同一个包下的类可以*访问。值得注意的是,父包和子包之间确实表示了某种内在的逻辑关系,但在父包和子包在用法上则不存在任何关系,如果父包中的类要使用子包中的类,一样要使用包的全名。
1.2 import
Java 引入了 import 关键字,import 可以向某个 Java 文件中导入指定包层次下某个类或全部类
- 导入单个类:
import package.subPackage…ClassName;
- 导入全部类
import package.subPackage…*;
一旦用 import导入指定类后,在该源文件中使用这些类的时候可以省略包前缀,不用使用包全名。
PS:如果一个源文件中导入了两个包,这两个包下有重名的类,这个时候依然要使用全名调用。
1.3 import static
import static 用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。
- 导入单个:
import static package.subPackage…ClassName.fieldName|methodName;
- 导入全部:
import static package.subPackage…ClassName.*;
导入后,调用方法或静态变量,不需要写类名。
2 类的继承
2.1 继承的特点
Java 的继承通过 extends 关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有的也称其为基类、超类。
子类是对父类的扩展,子类是一种特殊的父类。每个类最多只有一个直接父类。值得指出的是,Java的子类不能获得父类的构造器。
如果定义一个 Java 类时并未显式指定这个类的直接父 类,则这个类默认扩展 java. lang. Object 类。因此,java. lang. Object 类是所有类的父类,要么是其直接父类,要么是其间接 父类。
2.2 重写父类的方法
- 子类包含与父类同名方法的现象被称为方法重写( Override),也被称为方法覆盖。
- 方法的重写要遵循“ 两同两小一大”规则,“ 两同”即方法名相同、形参列表相同;“ 两 小” 指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出 的异常类应比父类方法声明抛出的异常类更小或 相等;“ 一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例 方法。
- 当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父 类中被覆盖的方法。如果需要在子类方法中调用父类中被覆盖的方法,则可以使用 super( 被覆盖的是实例方法)或者父类类名( 被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。
- 如果父类方法具有 private 访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。如果子类中定义了一个与父类private方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法。
- 父类方法和子类方法也可以发生重载!
2.3 super 限定
需要在子类方法中调用父类方法,可以使用 super 限定来调用父类被覆盖的方法。super 用于限定该对象调用它从父类继承得到的实例变量或方法。和 this 一样不能在静态方法中使用。
当子类和父类拥有同名变量时,子类方法里访问的默认是子类定义的变量,父类的变量需要用 super 前缀来访问。
系统查找某一变量 a 的顺序:
- 查找该方法中是否有名为 a 的局部变量;
- 查找当前类中是否包含名为 a 的成员变量;
- 查找 a 的直接父类中是否有名为 a 的成员变量,依次上溯到 a 的所有费雷。
2.4 调用父类构造器
在子类构造器中调用父类构造器可以类似的使用 super 调用来完成。
值得注意的是,不管是否使用 super 显示执行父类的构造器初始化代码,子类构造器总会调用父类构造器一次,有如下几种情况:
- 子类构造器第一行使用 super 显示调用父类构造器,系统将根据 super 调用里传入的实参列表调用父类相应的构造器。
- 子类的的构造器第一行代码使用 this 显示调用本类中重载的构造器,系统将根据 this 调用里传入的实参列表调用本类中的另一个构造器, 执行本类另一个构造器之前,会调用父类的构造器。
- 子类构造器中既没有 super 也没有 this ,系统会在执行子类构造器之前,隐式调用父类无参构造器。
3 LeetCode
27. 移除元素
class Solution {
public int removeElement(int[] nums, int val) {
int count = 0;
for(int i = 0; i < nums.length - count; i++){
if(nums[i] == val){
for(int j = i + 1; j < nums.length; j++) {
nums[j - 1] = nums[j];
}
count++;
i--;
}
}
return nums.length - count;
}
}
28. 实现strStr()
class Solution {
public int strStr(String haystack, String needle) {
for(int i = 0; i < haystack.length() - needle.length() +1; i++){
if(haystack.substring(i, i + needle.length()).equals(needle))
return i;
}
return -1;
}
}