Java 继承(下)
-
Java 继承的老祖宗:Object 类
-
Object 类是所有类的父类;
-
一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组);
-
Java 中的每个类都可以使用 Object 类中定义的方法。
Ps:Java SE 8 API 文档官方地址:https://docs.oracle.com/javase/8/docs/api/index.html
-
官网对于 Object 类的介绍:
Class
Object
is the root of the class hierarchy. Every class hasObject
as a superclass. All objects, including arrays, implement the methods of this class.翻译:Object 类是类层次结构的根。每个类都有 Object 作为超类。所有对象,包括数组,都实现了这个类的方法。
-
相关 Api 示例:
下面的方法经常用于被重写:
-
equals(Object obj)
Indicates whether some other object is "equal to" this one:
- 继承 Object 中的 equals 方法时,默认比较的是两个引用是否指向同一个对象,即默认比较的是两个对象的内存地址或值是否一致,与"=="的作用一致。
- 子类可以通过重写 equals 方法的形式,改变比较的内容。如:String 类重写了父类 Object 的 equals 方法: Compares this string to the specified object:比较的是两个字符串的值是否一致。
示例代码如下:
@Override //方法重写 public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Animal animal = (Animal) o; return month == animal.month && Objects.equals(name, animal.name); } //相对于 equals(Object o) 的方法重载 public boolean equals(Animal animal) { if (animal == null) return false; if (this.getName().equals(animal.getName()) && this.getMonth() == animal.getMonth()) return true; else return false; }
-
toString( ):Returns a string representation of the object:
-
默认返回的是一个对象的字符串表现形式:
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character '@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass( ).getName( ) + '@' + Integer.toHexString(hasCode( ))翻译:Object类的 toString 方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示组成。换句话说,此方法返回一个等于以下值的字符串:
getClass( ).getName( ) + '@' + Integer.toHexString(hasCode( ))- 输出对象名时,默认会调用类中的 toString( ) 方法;
- 继承 Object 中的 toString 方法时,默认输出对象的字符串表示形式:即类型信息+'@'+ 地址信息;
- 子类可以通过重写 toString 方法的形式,改变输出的内容以及表现形式。如 String 类重写了父类的 toString 方法,打印对象名是输出的是字符串的内容。
示例代码如下:
@Override public String toString() { return "昵称:" + this.getName() + ";年龄:" + this.getMonth(); }
-
-
-
-
final 关键字的作用:可使某些类不被继承、某些方法不被重写、某些数据不被修订
-
final 修饰类的时候
- final 表示最终的,被 final 修饰的类表示不允许被继承,即不允许有子类(可以理解为“终极类”、“太监类”);
- final 与类的访问修饰符位置可以互换,只要都是写在 class 关键字前面即可。即既可以写成 public final class,也可以写成 final public class。
- 像 String、System 类等都是 final 类;
-
final 修饰成员方法的时候
- 表示该成员方法不允许被子类重写
- final 修饰的成员方法可以被子类继承使用
- final 不能修饰构造方法:构造方法只允许使用 private、protected 和 public 来修饰。
- 表示该成员方法不允许被子类重写
-
final 修饰变量的时候
此处的变量根据作用域不同,分为两类,一类是成员属性,一类是局部变量;
- 当 final 修饰方法内的局部变量时,只要在具体被使用之前进行赋值即可,一旦赋值不允许被修饰。
- 当 final 修饰类中成员属性时,有三个对该成员属性赋值的位置:(1)定义时直接初始化;(2)构造方法;(3)构造代码块。
- 当 final 修饰类当中的成员属性时,如果我们在定义它的时候没有给它设置初始值,此时在该类中只有两个位置可以做赋值的操作:(1)构造方法;(2)构造代码块。只有这两个地方允许对 final 修饰的成员属性赋值。假定我们在任意位置都没有对 final 修饰的成员属性做赋值操作,则编译报错,会提示该字段未被初始化。而初始化的过程是需要在它构造的过程当中来完成的。因此,要么在定义它的时候直接对它初始化,要么就只能在构造方法或者构造代码块对它完成初始化操作。
Ps: 引用数据类型被 final 修饰后,引用地址是否会发生改变?属性值是否会发生改变?
final Animal animal = new Animal("凡凡",1); //animal = new Animal();//此行代码报错,提示 animal 不允许再次被赋值 animal.name = "豆豆"; animal.month = 12;//ok
(1)引用数据类型被 final 修饰后,引用地址不允许再发生改变,即不允许再指向另一个对象,但是对象的内容是可变的,对象的属性值可以根据需求被修改的。
(2)如果我们希望一个对象的某个成员属性既不允许被修改,同时把它当成全局变量来使用,就可以结合 final 和 static 两个关键字一起来修饰它。它会随着类的加载而产生,随着类的销毁而被释放。final 和 static 的顺序可以互换。一般来说使用 static 和 final 组合来共同修饰程序的一些配置信息相关的属性,因为此类配置信息一般只需要设置一次,并且后续不需要做变动。如:public static final String URL="www.baidu.com"
(3)使用 final 修饰 可以提高性能,但会降低可扩展性。 -
-
注解简介
如:@Override
- JDK 1.5 版本引入的一个特性;
- 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释;
- 相当于一种标记。在程序当中加入注解,相当于为程序打上了某种标记;被打过标记的这些程序,开发工具就可以借由这些标记来更好地理解我们所编写的类、方法等元素的意义。如一个方法被打上@Override标签,即说明它是重写父类的方法。
- 注解按运行机制分:源码注解、编译时注解、运行时注解。
- 源码注解:当我们的程序由javac编译成.class文件之后,这些注解就会被编译器给去掉了。注解只在源码中存在,编绎成 .class 文件就不存在了。这些注解我们叫源码注解。
- 编译时注解:注解在源码和 .class 中都存在。
- 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。如 Spring 注解:@Autowired,在程序的运行当中,自动将我们外部传入的信息加载进去。
- 按来源分:来自JDK的注解(如 @Override)、来自第三方的注解(如 Spring 注解:@Autowired)、我们自己定义的注解
- 元注解:对注解进行注释