JAVA_方法的重写override&==和equals&super关键字&继承树追溯

方法的重写 override
  1. 定义:指子类继承了父类的方法,对父类方法进行的改写/覆盖,称为override

  2. 方法的重写需要符合下面的三个要点:

    1.“==”: 方法名、形参列表相同。

    2.“≤”:返回值类型和声明异常类型,子类小于等于父类。//见下代码示例

    3.“≥”: 访问权限,子类大于等于父类。

  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
  1. ==表示判断数值是否相等 或者 是否地址相同
  2. equals表示内容相同
  3. Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的人就是同一个人。 Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。可以通过“右键”“source”“hashword"直接生成判断代码。
  4. 代码示例:
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关键字
  1. super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性
  2. 代码示例:
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);
	}
}

在这里插入图片描述

继承树追溯
  1. 属性/方法查找顺序:(比如:查找变量h)

    1. 查找当前类中有没有属性h

    2. 依次上溯每个父类,查看每个父类中是否有h,直到Object

    3. 如果没找到,则出现编译错误。

    4. 上面步骤,只要找到h变量,则这个过程终止。

  2. 构造方法调用顺序:
    构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

  3. 代码示例:

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("创建子类");
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值