继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
生活中的继承:
类的继承格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的
class 父类 {
}
class 子类 extends 父类 {
}
为什么需要继承?
提高代码的复用性(也就是同样的代码可以多次使用,但不必写出)。
子类继承父类之后,就具备了父类中的所有属性和方法,子类就不会存在重复的代码。
注意:
Java不支持多继承,但支持多重继承。通俗地说,一个类只允许有一个父类,但它可以有多个子类。
- 不允许多继承: 如果B类继承A类,则B类便不能继承C类。(即:B继承A,且B继承 C,这样子是错误的写法)
- 支持多重继承: B继承 A,C继承 B……这样是可行的。
- 不同类可以继承同一个类: B继承 A,C也继承 A,这样也是可行的
继承的特性
- 子类拥有父类 非private 的属性和方法(注意是 非private,也就是:不是父类私有的东西,你都可以拥有。举个例子就是:你父亲的财产你可以继承,但父亲的人生经历你无法继承)
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承。这点上面也说了,此处不再赘述。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承关键字
- 继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
extends不再赘述,这里说一下 implements 关键字:
- 使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
也就是 类不支持多继承,使用 extends 关键字;但接口支持多继承,使用 implements 关键字
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
说白了就是一个指代作用。举个例子:张三使用爬虫爬到了监狱,显然他违法了。
这个语句里,“他” 指代 “张三”。
而在Java 中 super 指代当前对象的父类,this 指代自己
final关键字
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
- 声明类:
final class 类名 { //类体 }
- 声明方法:
修饰符(public/private/default/protected) final 返回值类型 方法名(){ //方法体 }
- 注: 实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类 的方法自动地声明为 final,但是实例变量并不是 final
构造器
- 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
- 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
- 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
补充知识点:Java Number类与 Math类
Java Number类
一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。
然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
包装类 | 基本数据类型 |
---|---|
Boolean | boolean |
Byte | byte |
Short | short |
Integer | int |
Long | long |
Character | char |
Float | float |
Double | double |
这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。Number 类属于 java.lang 包。
至于用不用得上,咱也不知道,也不难记,目前来说我也不知道它的应用场景,以后用上了再次总结。
Java Math 类
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
Number & Math 类常用方法
方法 | 描述 | 方法 | 描述 |
---|---|---|---|
xxxValue() | 将Number对象转化为 xxx 数据类型的值并返回 | compareTo() | 将number对象与参数比较 |
equals() | 判断number对象是否与参数相等 | valueOf() | 返回一个Number对象指定的内置数据类型 |
toString() | 以字符串形式返回值 | parseInt() | 将字符串解析为int类型 |
abs() | 返回参数的绝对值 | ceil() | 返回大于等于给定参数的最小整数,类型为double |
floor() | 返回小于等于给定参数的最大整数 | rint() | 返回与参数最接近的整数,返回类型为double |
round() | 表示四舍五入,Math.floor(x+0.5) | min() | 返回两个参数中的最小值 |
max() | 返回两个参数中的最大值 | exp() | 返回自然数底数e的参数次方 |
log() | 返回参数的自然数底数的对数值 | pow() | 返回第一个参数的第二个参数次方 |
sqrt() | 求参数的算数平方根 | sin() | 求指定double类型参数的正弦值 |
cos() | 求指定double类型参数的余弦值 | tan() | 求指定double类型参数的正切值 |
asin() | 求指定double类型参数的反正弦值 | acos() | 求指定double类型参数的反余弦值 |
atan() | 求指定double类型参数的反正切值 | atan2() | 将笛卡尔坐标转换为极坐标,并返回极坐标的角度值 |
toDegrees() | 将参数转化为角度 | toRadians() | 将角度转换为弧度 |
random() | 返回一个随机数 |
到目前为止,我也不知道什么时候用得上这个。个人觉得用得上的
compareTo()、equals()、valueOf()、toString()、parseInt()
不过到目前为止,真的是啥也不会,感觉离一个产品还远得很。
恳请各位大佬评论指正~