包、继承以及 LeetCode 27、28题
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;
}
}
包、继承以及 LeetCode 27、28题的更多相关文章
- leetcode第28题--Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
- 【LeetCode算法-28/35】Implement strStr()/Search Insert Position
LeetCode第28题 Return the index of the first occurrence of needle in haystack, or -1 if needle is not ...
- LeetCode 每日一题「判定字符是否唯一」
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...
- LeetCode第[18]题(Java):4Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...
- 前端与算法 leetcode 27.移除元素
目录 # 前端与算法 leetcode 27.移除元素 题目描述 概要 提示 解析 算法 @(目录) # 前端与算法 leetcode 27.移除元素 题目描述 27.移除元素 概要 题目本身其实挺简 ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- leetcode第37题--Count and Say
题目:(据说是facebook的面试题哦) The count-and-say sequence is the sequence of integers beginning as follows:1, ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode的刷题利器(伪装到老板都无法diss你没有工作)
在工程效率大行其道的今天,如果不会写点代码以后也不容易在测试圈混下去.今天给大家推荐一个LeetCode的刷题利器,可以伪装到连你老板在这里走过去都无法确认你是在干活呢,还是在干活呢. LeetCod ...
随机推荐
- ASP.Net Core MVC+Ajax 跨域
要求 C端:用户端(http://www.b.com) A端:管理端(http://admin.b.com) 问题:A端上传图片到C端指定文件夹内保存,供C端使用. 方案 ① C端从nuget引入Mi ...
- STM32学习笔记(一):跑马灯
本实验所采用的开发板为正点原子的MiniSTM32f103rc开发板,主函数程序如下,注释如下:main.c #include "stm32f10x.h" void Delay(u ...
- go语言调度器源代码情景分析之六:go汇编语言
go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也需要经过汇编器转换成机器指令才能被CPU ...
- 解决tomcat部署项目中碰到的几个问题
在tomcat上部署项目并进行测试,经常会碰到各种问题.在不同的操作系统上部署,对问题的解决也会有一些差异. 1 发现问题 1.1 项目部署 先将项目达成war包,放到tomcat的webapps目录 ...
- Java连接redis
一.依赖包 jedis-2.1.0.jar commons-pool-1.6.jar 二.实例 //连接参数public class RedisConfig { public static int ...
- bind、call和apply对比和使用
最开始关于call.apply.bind函数的使用时,总是很模糊,不知道用哪一个,this指向问题等,看了一些别人的总结后有了一定的理解,所以特地记录一下: 要搞清楚call.apply.bind我们 ...
- 拼多多大数据开发工程师SQL实战解析
不久前,裸考国内知名电商平台拼多多的大数据岗位在线笔试,问答题(写SQL)被虐的很惨,完了下来默默学习一波.顺便借此机会复习一下SQL语句的用法. 本文主要涉及到的SQL知识点包括CREATE创建数据 ...
- 第14章 纪元时间转换 - IdentityModel 中文文档(v1.0.0)
JWT令牌使用所谓的Epoch或Unix时间来表示日期/时间. IdentityModel包含用于DateTime和DateTimeOffset转换到/来自Unix时间的扩展方法: var dt = ...
- C#如何根据类的名词创建类的实例
这个大概分为两种情况:1-在同一程序集访问该类:2-在不同的程序集访问 A:同一程序集,使用微软的创建对象的类:System.Activator: 先通过类名,获取到类型,在使用用于创建本地或远程对象 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...