一:继承
1.继承
类与类之间有三大关系,is,use,has,而继承则表达的是is这一关系。
Java类中只支持单继承,即一个类只能有一个直接父类。
继承是指在新类在不增加自身代码的情况下,通过从现有类中继承其属性和方法,来实现充实自身内容,这种现象或行为称为继承。
2.如何继承
使用extends 关键字申明一个类是从另一个类继承而来
1.类那些中能继承?哪些不能继承?
-
可以继承可见的成员
-
不能继承 private/构造/static初始化器/实例初始化器
二:实例化顺序
1>:父类的静态成员变量,静态代码块加载
2>:子类的静态成员变量,静态代码块加载
3>:父类的实例变量和代码块加载
4>:子类的实例变量和代码块加载
5>:父类的构造函数加载
6>:子类的构造函数加载。
1.super 和 this
this :哪一个对象调用方法,方法中的this就是哪一个对象。
区别:
调用方法:this访问本类中的方法,包括从父类继承的方法。
super访问父类的方法。
调用构造方法:this([参数列表])表示调用本类的构造方法,必须放在构造方法的首行;
super([参数列表])表示调用父类构造,必须放在子类构造方法首行。如果表示调用父类的无参构造,即super()可省略。
调用字段:this字段:调用的当前对象的字段,包括从父类继承的字段;
super字段:调用的是父类中的字段。
使用:this在实例方法中可以使用,在static方法中不能使用。每个类都有this。
super在实例方法中可以使用,在static方法中不能使用,且只能出现在子类中。
其他区别:this表示当前对象
super不能表示当前对象。
-
构造方法中都会调用父类的构造
2.重写
在继承关系中。 重写方法与被重写方法必须有相同的方法名称。 重写方法与被重写方法必须有相同的参数列表。 重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。 重写方法不能缩小被重写方法的访问权限。 不能用子类的非静态方法重写(覆盖)父类的静态方法,否则编译报错。 不能重写父类中的最终方法。 不能用子类的静态方法重写父类的实例方法
方法重载和方法重写的区别
方法重载是在一个类中定义多个同名但参数不同的方法,而方法重写则是在子类中重写父类的方法,且方法名和参数都相同。
方法重载是在编译时多态,而方法重写是在运行时多态。
3.隐藏
隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的: 当发生隐藏的时候,声明类型是什么类,就调用对应类的方法,而不会发生动态绑定 属性只能被隐藏,不能被覆盖 变量可以交叉隐藏: 子类实例变量/静态变量可以隐藏父类的实例/静态变量 不能用子类的静态方法隐藏父类中的非静态方法,否则编译报错
4.final
-
final 修饰类,没有子类
-
final 修饰的方法,不能被重写
-
final 修饰的变量,不能多次被赋值
-
final修饰的方法,可以被子类继承,但是不能重写。
特例
A extend B(则B不能被final修饰) final A (则A不能被继承)
5.Object
-
-
- toString 返回当前对象本身的有关信息,返回字符串对象。 一般为 return 类 + 字段 + 值 特例 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", gender=" + gender + '}'; } - finalize 从JDK 9 开始,被弃用 作用:在垃圾收集器将对象从内存中清除之前做必要的清理工作。 - getClass 获取类结构信息,返回Class对象。 - hashCode 返回该对象的哈希码值。 @Override public int hashCode() { int result = 1; result = 31 * result + name.hashCode(); result = 31 * result + age; result = 31 * result + gender; result = 31 * result + id.hashCode(); return result; } - equals 【了解干嘛的】 “==” 判断两个变量值是否相等, 引用数据类型的值是其地址(引用) equals 用于判断两个对象是否相等,基于内容(字段) 例题 @Override public boolean equals(Object obj) { // this obj if (obj == null) { return false; } if (this == obj) { return true; } // 学生是同一个对象要求是 学号一样就是同一个 // 类型转换, 有继承关系 向上转型 和 向下转型 // Student --> Object 向上转型 // Object o = this; // Object --> student 向下转型 强制类型转换 Student stu = (Student) obj; if (stu.id == this.id || stu.id.equals(this.id)) { return true; } return false; } /* equals 结果为 true hashCode 值一样 hashCode 一样 equals 结果不一定 */ 重写 equals 要求: * 对 null 返回 false * 自反性:x.equals(x) 返回true * 对称性: x.equals(y) 的值 和 y.equals(x) 的值一样 * 传递性: x.equals(y) 为 true, y.equals(z) 为 true, 此时 x.equals(z) 为 true * 一致性: x.equals(y) 多次调用结果一致 * 重写了 equals 就要重写 hashCode - hashCode和equals的区别 如果*equals* *结果为* true 则hashCode 值一样 如果hashCode值 *一样* ,*equals* *结果不一定* - clone 浅拷贝[实现 Cloneable 接口]
-
-