继承的实现

编写父类

  1. class Animal{
  2. // 公共的属性和方法
  3. }

编写子类,继承父类

  1. class Dog extends Animal{
  2. // 子类特有的属性和方法
  3. }

父类的构造方法,不允许被继承,不允许被重写

方法的重载

  1. 同一个类中
  2. 方法名相同,参数列表不同(参数类型,顺序,个数)
  3. 方法返回值,访问修饰符任意
  4. 与方法的参数名无关
  5. 静态方法和最终方法可以被重载

方法的重写

  1. 有继承关系的子类中
  2. 方法名相同,参数列表相同(参数类型,顺序,个数),方法返回值可以允许是子类类型
  3. 方法的访问修饰符是可以允许有变化的,但是有条件,即访问范围需要大于等于父类的访问范围
  4. 与方法的参数名无关
  5. 静态方法和最终方法不仅能被重写

在子类中也可以定义与父类重名的属性,此时会覆盖父类的属性

访问修饰符

image.png
#同包:包括 同包子类 和 同包对象
#子类:包括 同包子类 和 非同包子类
#其他:非同包对象

继承的初始化顺序

  1. 父类静态成员,代码块 #静态成员和代码块的顺序,与书写顺序有关
  2. 子类静态成员,代码块 #静态成员和代码块的顺序,与书写顺序有关
  3. 父类对象构造
  4. 子类对象构造

super关键字

父类对象的引用,可以让子类访问父类中允许被派生的任意成员

  1. public class Cat extends Animal{
  2. public Cat(String name,int age){
  3. super.name; // 访问父类属性
  4. super.pring(); // 访问父类方法
  5. super(); // 访问父类构造方法
  6. }
  7. }
  1. 子类的构造方法中必须调用其父类的构造方法
  2. 如果子类的构造方法找那个没有显式标注,那么子类构造默认调用父类无参构造方法
  3. 如果子类的构造方法找那个没有显式标注,且父类中没有无参的构造方法,则编译出错 `1
  4. super(参数1,参数2 … )会调用父类有参构造方法
  5. super()必须放在子类构造方法有效代码的第一行
    1. public class Cat extends Animal{
    2. public Cat(String name,int age){
    3. // 子类构造默认调用父类的无参构造方法
    4. // super(name,age)会调用父类的有参构造方法
    5. super(name,age)
    6. }
    7. }

this:当前类对象的引用

  • 访问当前类的成员方法
  • 访问当前类的成员属性
  • 访问当前类的构造方法
  • 不能在静态方法中使用

super:父类对象的引用

  • 访问父类的成员方法
  • 访问父类的成员属性
  • 访问父类的构造方法
  • 不能在静态方法中使用

构造方法调用时,this 和 super 不能同时出现

Object类

  • Object类是所有类的父类
  • 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类(包括数组)
  • Java中的每个类都可以使用Object中定义的方法

Java™ Platform, Standard Edition 8 API Specification

1,equals(Object obj)

  • 判断调用equals方法的对象和参数中的obj对象是否一致,即这两个对象是否指向同一块内存地址
  • 效果和 “ == “ 判断是一样的
  • 子类(比如String类)可以通过重写equals方法的形式,改变比较的内容 ```java Dog dog1 = new Dog(); dog1.setName(“妞妞”); dog1.setAge(1);

Dog dog2 = new Dog(); dog2.setName(“妞妞”); dog2.setAge(1);

System.out.println(dog1.equals(dog2)); // false System.out.println(dog1 == dog2); // false

  1. #String类中的equals方法判断的不是两个字符串对象的引用是否一致,而是字符串值是否一致
  2. ```java
  3. String str1 = new String("hello");
  4. String str2 = new String("hello");
  5. System.out.println(str1.equals(str2)); // true
  6. System.out.println(str1 == str2); // false
  7. String str3 = "hello";
  8. String str4 = "hello";
  9. System.out.println(str3.equals(str4)); // true
  10. System.out.println(str3 == str4); // true

2,toString()

  • 输出对象名时,默认会直接调用类中的toString
  • 继承Object中的toString方法时,输出对象的字符串表现形式:类型信息 + @+ 地址信息
  • 子类(比如String类)可以通过重写toString方法的形式,改变输出内容
  1. Dog dog1 = new Dog();
  2. dog1.setName("妞妞");
  3. dog1.setAge(1);
  4. System.out.println(dog1); // com.imooc.animal.Dog@15db9742
  5. System.out.println(dog1.toString()); // com.imooc.animal.Dog@15db9742

String类中的toString方法输出的是字符串的值

  1. String str1 = new String("hello");
  2. String str2 = "hello";
  3. System.out.println(str1); // hello
  4. System.out.println(str2); // hello

final关键字

  1. final class:该类没有子类

  2. final 方法:

  • 该方法不允许被子类重写,但是可以正常被子类继承使用
  • 该方法可以被重载
  • 不能用于修饰构造方法
  1. final 变量:
  • 基本数据类型的变量 => 初始赋值之后不能更改

— 方法内局部变量:只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改
— 类中成员属性:赋值过程:1,定义直接初始化 2,构造方法 3,构造代码块

  • 引用类型的变量 => 初始化之后不能再指向另一个对象,但对象的内容是可变的
  1. 可配合static使用

常用于配置信息,比如:public static final String URL = “www.google.com”

注解

  • JDK1.5版本引入的一个特性
  • 可以声明在包,类,属性,方法,局部变量,方法参数等前面,用来对这些元素进行说明,解释
  • 源码注解:只在源码中存在,编译成.class文件就不存在了,比如@override
  • 编译时注解:在源码和.class文件中都存在
  • 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑,比如spring框架的@Autowired

image.png

  1. // 重写方法的注解
  2. @Override
  3. public void eat() {
  4. }

Alt + /:在子类中自动列出可以重写的父类方法