学习java的第十九天。。。(方法重写、Object类)

发布于:2022-08-04 ⋅ 阅读:(344) ⋅ 点赞:(0)

方法重写

子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写

就像之前写的代码:

public class Pet {
	private String name;
	private int health;
	private int love;

	// 添加构造方法
	public Pet() {
	}

	public Pet(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHealth() {
		return health;
	}

	public void setHealth(int health) {
		this.health = health;
	}

	public int getLove() {
		return love;
	}

	public void setLove(int love) {
		this.love = love;
	}

	public void print() {
		System.out.println(this.getName() + "  " + this.getLove() + " "
				+ this.getHealth());
	}
}
//Dog
public class Dog extends Pet {
	//strain属性是Dog类里独有的属性,其他类没有,所以要在Dog类里定义
	
	private String strain;
	
	public Dog(){
	}

	public Dog(String name, int health, int love, String strain) {
		super(name, health, love);
		this.strain = strain;
	}

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}
	
}
//测试类
        Dog dog1=new Dog("大黄", 66, 66, "柯基");
		//在dog类中没有setName方法,但是Dog类对象dog1是可以调用,因为Dog类继承了pet类
		dog1.setName("小黄");
		dog1.print();

 

这里只能输出父类Pet的print()的方法, 并不能把Dog类中的strain属性输出,所以需要使用到方法重写

 为什么要使用方法重写

父类的方法无法满足子类的需求,就需要使用到方法重写

什么是方法重写

子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写

//父类Pet
public class Pet {
	private String name;
	private int health;
	private int love;

	// 添加构造方法
	public Pet() {
		//调用Pet类的父类Object类里的无参构造方法
		super();
	}

	public Pet(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHealth() {
		return health;
	}

	public void setHealth(int health) {
		this.health = health;
	}

	public int getLove() {
		return love;
	}

	public void setLove(int love) {
		this.love = love;
	}

	public void print() {
		System.out.print("昵称:"+this.getName() + " 亲密度:" + this.getLove() + " 健康值"
				+ this.getHealth());
	}
}
//Dog类
public class Dog extends Pet {
	//strain属性是Dog类里独有的属性,其他类没有,所以要在Dog类里定义
	
	private String strain;
	
	public Dog(){
	}

	public Dog(String name, int health, int love, String strain) {
		super(name, health, love);
		this.strain = strain;
	}

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}
	@Override
	public void print() {
		super.print();
		System.out.println(" 品种:"+this.getStrain());
	}
}
//penguin类
public class Penguin extends Pet {
	//定义Penguin类里独有的属性
	
	private String sex;
	
	public Penguin(){
		super();//这个地方表示调用父类的无参构造方法
	}

	public Penguin(String name, int health, int love, String sex) {
		super(name, health, love);
		this.sex = sex;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	public void print() {
		super.print();
		System.out.println(" 性别:"+this.getSex());
	}
}
//测试类
        Dog dog = new Dog("旺旺", 5, 8, "恶霸犬");
		dog.print();
		
		Penguin penguin = new Penguin("QQ", 0, 1, "雄");
		penguin.print();

 输出结果

方法重写的规则

需要是该类的子类
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类

方法重写与方法重载

位置 方法名 参数表 返回值 访问权限修饰符
方法重写 子类 相同 相同 相同或者是子类 不能比父类更严格
方法重载 同类 相同 相同 无关 无关

Object类

Object类是所有类的父类

Object被子类经常重写的方法

toString() 返回当前对象本身的有关信息
equals() 比较两个对象是否是同一个对象,是则返回true
hashCode() 返回改对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象

toString对象的重写

若不重写toString,输出的则是:包名.类名.@.hash码值,是地址;若重写之后则输出对象本身的值。

public static void main(String[] args) {
		//创建学生类对象
		Student stu = new Student("马力", 66);
		System.out.println(stu);//cn.bdqn.demo02.Student@40671416
		String str=stu.toString();//按住ctrl点击toString可以查看
		System.out.println(str);//cn.bdqn.demo02.Student@40671416
		System.out.println(stu.getClass().getName()+'@'+Integer.toHexString(stu.hashCode()));//cn.bdqn.demo02.Student@40671416
	}

 

 可以按住ctrl,点击toString

 

    @Override
	public String toString() {
		return "姓名:"+this.getName()+",年龄:"+this.getAge(); 
	}

 重写之后输出的代码是

 还可以右击鼠标,——>Source——>Generate toString

 

 这里可以选择在toString中重写哪些方法

equals()方法

为什么要重写equals()方法:

 object类中的equals()方法比较是的两个对象的地址值,不能满足子类的需求

   “==”表示比较两个基本数据类型,“equals”表示比较两个对象。若不引入object类的equals方法,则输出为对象的地址,而引入以后则输出对象的值。

public static void main(String[] args) {
		Dog dog3 = new Dog("马力", 78, 56);
		System.out.println(dog3);
		System.out.println(dog3.toString());
		
		Dog dog2 = new Dog("马力", 78, 56);
		/*
		 * object类中的equals()方法比较是的两个对象的地址值,不能满足子类的需求:
		 * string类里只要两个字符串对象的内容相同,就认为两个对象是同一个对象,所以String类重写了0bject类里的equals()方法
		 * Dog类里只要两个Dog对象的昵称、品种和健康值一致,就认为两个Dog对象是同一个对象,所以也需要在Dog类里重写Object里的equals()方法
		 */
		
		boolean result = dog2.equals(dog3);
		System.out.println(result);//false
		
		System.out.println(dog3);
		System.out.println(dog2);
		
		String str1 = new String("dsad");
		String str2 = new String("dsad");
		System.out.println(str1.equals(str2));
	}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到