方法的重写 override
-
定义:指子类继承了父类的方法,对父类方法进行的改写/覆盖,称为override
-
方法的重写需要符合下面的三个要点:
1.“==”: 方法名、形参列表相同。
2.“≤”:返回值类型和声明异常类型,子类小于等于父类。//见下代码示例
3.“≥”: 访问权限,子类大于等于父类。
-
代码示例:
package oo2;
/**
* 测试Override用法
*
* @author 王立生
*
* 题目:创建两个类:运载工具,马。构建运载工具类的方法,马类继承运载工具类的方法并重写方法
*/
public class TestOverride {
public static void main(String[] args){
Horse h=new Horse();
h.run();
h.stop();
}
}
class Vehicle{
public void run(){
System.out.println("Run Run Run!");
}
public void stop(){
System.out.println("Stop Stop Stop");
}
public Person I(){
return new Person();
}
}
class Horse extends Vehicle{
public void run(){
System.out.println("Jia Jia Jia!");//修改了父类的run方法,即实现了方法的覆盖/重写
}
public void stop(){
System.out.println("Yu Yu Yu!");
}
public Student I(){
return new Student("wls",23,"ee");//第44行和第29行方法重写,第44行方法(子类)的返回值类型应该小于等于第29行方法(父类)的返回值类型。
}
}
==和equals
- ==表示判断数值是否相等 或者 是否地址相同
- equals表示内容相同
- Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的人就是同一个人。 Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。可以通过“右键”“source”“hashword"直接生成判断代码。
- 代码示例:
package oo2;
/**
* 测试equals用法
*
* @author 王立生
*
* 题目:
*/
public class TestEquals {
public static void main(String[] args){
Object obj;
String str; //本来就存在这两个类
User u1=new User(123,"wls",456);
User u2=new User(123,"lsw",567);
System.out.println(u1==u2); //两个是不同对象,故地址肯定不同
System.out.println(u1.equals (u2)); //以id是否相同判断是否相等(equals)
}
}
class User{
int id;
String name;
int pwd;
public User(int id,String name,int pwd){
this.id = id;
this.name = name;
this.pwd = pwd;
}
@Override //找到源码construction...自动生成
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override //找到源码的hashcode...自动生成
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
return true;
}
}
super关键字
- super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性
- 代码示例:
package oo2;
/**
* 测试super的用法
*
* @author 王立生
*
* 题目:建立父类,初值化值为100,并输出父类值100;建立子类,调用父类方法,初始化值为200,输出子类值
*
*/
public class TestSuper01 {
public static void main(String[] args){
new ChildClass().f();
}
}
class FatherClass{
public int value;
public void f(){
value=100;
System.out.println("父值为:"+value);
}
}
class ChildClass extends FatherClass{
public int value;
public void f(){
super.f(); //调用父类中的f(),所以才能输出第一行结果
value=200;
System.out.println("子值为:"+value);
System.out.println(value);
System.out.println(super.value);
}
}
继承树追溯
-
属性/方法查找顺序:(比如:查找变量h)
-
查找当前类中有没有属性h
-
依次上溯每个父类,查看每个父类中是否有h,直到Object
-
如果没找到,则出现编译错误。
-
上面步骤,只要找到h变量,则这个过程终止。
-
-
构造方法调用顺序:
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。 -
代码示例:
package oo2;
/**
* 继承树追溯
*
* @author 王立生
*
* 题目:建立父类和子类,方法子类继承父类,输出子类结果,看父类是否输出
*/
public class TestSuper022 {
public static void main(String[] args){
System.out.println("创建一个东东");
new ChildClass3();
}
}
class FatherClass3{
public FatherClass3(){ //没有void前缀的方法,只能以类名作为方法名
System.out.println("创建父类!");
}
}
class ChildClass3 extends FatherClass3{
public ChildClass3(){
System.out.println("创建子类");
}
}