欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

包、继承以及 LeetCode 27、28题

程序员文章站 2022-04-09 10:44:25
1 package、import 和 import static 1.1 Package Java 引入了包(Package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理问题。Java 允许将相关的类放在同一个 package 下,从而组成逻辑上的类库单元。如果希望把一个类放在指定 ......

1 package、import 和 import static

1.1 package

java 引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理问题。java 允许将相关的类放在同一个 package 下,从而组成逻辑上的类库单元。如果希望把一个类放在指定的包结构下,应该在 java 源代码的第一个非注释行放置如下格式代码:

1 package packagename;

位于包中的每个类的完整类名都应该是包命和类名的组合,如果其他人需要使用该包下的类,也应该使用完整类名。

用命令行编译时,用 javac -d . xxx.java 会生成包层次相同的目录结构。
位于包中的类,在文件系统中也必须有与包命层次相同的目录结构。推荐用上述方法编译。
一个源文件只能指定一个包,只能包含一条 package 语句。同一个包下的类可以*访问。值得注意的是,父包和子包之间确实表示了某种内在的逻辑关系,但在父包和子包在用法上则不存在任何关系,如果父包中的类要使用子包中的类,一样要使用包的全名。

1.2 import

java 引入了 import 关键字,import 可以向某个 java 文件中导入指定包层次下某个类或全部类

  • 导入单个类:
1 import package.subpackage…classname;
  • 导入全部类
1 import package.subpackage…*;

一旦用 import导入指定类后,在该源文件中使用这些类的时候可以省略包前缀,不用使用包全名。

ps:如果一个源文件中导入了两个包,这两个包下有重名的类,这个时候依然要使用全名调用。

1.3 import static

import static 用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。

  • 导入单个:
1 import static package.subpackage…classname.fieldname|methodname;
  • 导入全部:
1 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 的顺序:

  1. 查找该方法中是否有名为 a 的局部变量;
  2. 查找当前类中是否包含名为 a 的成员变量;
  3. 查找 a 的直接父类中是否有名为 a 的成员变量,依次上溯到 a 的所有费雷。

2.4 调用父类构造器

在子类构造器中调用父类构造器可以类似的使用 super 调用来完成。

值得注意的是,不管是否使用 super 显示执行父类的构造器初始化代码,子类构造器总会调用父类构造器一次,有如下几种情况:

  • 子类构造器第一行使用 super 显示调用父类构造器,系统将根据 super 调用里传入的实参列表调用父类相应的构造器。
  • 子类的的构造器第一行代码使用 this 显示调用本类中重载的构造器,系统将根据 this 调用里传入的实参列表调用本类中的另一个构造器, 执行本类另一个构造器之前,会调用父类的构造器。
  • 子类构造器中既没有 super 也没有 this ,系统会在执行子类构造器之前,隐式调用父类无参构造器。

3 leetcode

27. 移除元素

 1 class solution {
 2     public int removeelement(int[] nums, int val) {
 3         int count = 0;
 4         for(int i = 0; i < nums.length - count; i++){
 5             if(nums[i] == val){
 6                 for(int j = i + 1; j < nums.length; j++) {
 7                     nums[j - 1] = nums[j];
 8                 }
 9                 count++;
10                 i--;
11             }
12         }
13         return nums.length - count;
14     }
15 }

28. 实现strstr()

1 class solution {
2     public int strstr(string haystack, string needle) {
3         for(int i = 0; i < haystack.length() - needle.length() +1; i++){
4             if(haystack.substring(i, i + needle.length()).equals(needle))
5                 return i;
6         }
7         return -1;
8     }
9 }