java基础(6Day-继承-多态)

Java类和对象-继承-多态

所谓继承,就是往上找。

(先找自身,如果没有,找父类,没有,再向上找,直到Object结束)

在这里插入图片描述

继承 - 创建子类,父类构造方法会执行吗?

public static void main(String[] args) {
		Person p = new Person();
		p.setName("李世民");
		p.setAge(49);
		System.out.println("李世民 Person对象:"+p.toString());
		
		Student s = new Student();
		s.setName("学生 李治");
		s.setAge(20);
		System.out.println("学生 李治 Student对象:"+s.toString());

	}

运行结果:
在这里插入图片描述

结论:
不仅父类的构造方法会执行
父类先于子类构造方法执行(没有父类就没有子类)
创建了一个学生,其实是创建了两个对象:一个Person对象,一个Student自身的对象

Object这个类

1.toString()  输出对象信息
2.equals()    比较对象是不是相同   对象a.equals(对象b)  
3.hashCode()  哈希值,每个对象的哈希值是唯一的

toString( )找父类(Object.class)

在这里插入图片描述

方法重写@Override

在这里插入图片描述

方法重写不能改变父类方法的:
	1.参数的个数和类型(参数变量名称可改)
	2.返回值类型不能改。
@Override 注解 保证你重写了父类的方法

方法重载(@Overload)

// 1.方法名称相同,返回值类型相同
// 2.参数类型不同,或个数不同,满足其一就是重载
System.out.println( (int)a );
System.out.println( (double)a );
System.out.println( (int)a+" "(double)b  );

equals

Person p1 = new Person();
Person p2 = new Person();
//equals()来着Object
System.out.println(p1.equals(p2));// 结果为:false
//Object equals 比较的是对象的地址

字符串的 equals( ) 比较的不是 “ 地址 ” 而是 值

String s1=new String("Hello");
String s2=new String("Hello");
System.out.println(s1.equals(s2));// 结果为:ture
System.out.println(s1==s2);// 结果为:fales

String s3="Hello";
String s4="Hello";
System.out.println(s1==s3);// 结果为:fales
System.out.println(s3==s4);// 结果为:ture

向上转型

// 向上转型就是:用父类声明的变量 指向 子类的实例
Object animal = new Animal();
// 父类声明变量指向子类实例
List<String> list=new ArrayList<>();
List<String> list=new ArrayList<>();

在这里插入图片描述

参数传递过程中,往往出现向上转型

向下转型

先有向上转型,才能向下转型。
向下转型要强转

在这里插入图片描述
在这里插入图片描述

谁使用,this就指向谁

public class Person {
	private String name;
	private int age;
	@Override
	public boolean equals(Object obj) {
		Person person=(Person) obj;
		if (this.name.equals(person.name)&&this.age==person.age) {
			return true;
		}else {
			return false;
		}
	}
}

public class DemoEquals {
	public static void main(String[] args) {
        // 构造方法会帮助成员变量的初始化值
        // 基本数据类型 以0为主
        // 对象 字符串 就是null
		Person p1 = new Person();
		p1.setName("chen");
		p1.setAge(20);
		
		Person p2 = new Person();
		p2.setName("chen");
		p2.setAge(20);
		
		boolean b=p1.equals(p2);
		System.out.println(b);
	}
}

在这里插入图片描述

多态

在这里插入图片描述
在这里插入图片描述

问题

在这里插入图片描述

总结

对象三大特性-封装

1.成员变量私有化 private
    只能在本类下访问
2.因为成员变量私有化 getter/setter
3.为了初始化一些变量,写构造方法,先写无参构造,否则继承会出问题
	一旦有子类时,创建子类对象,先调用父类构造方法(无参)
4.重写 Object 的 toString 方法
难点1this,谁调用方法,this就指向谁(括构造方法)
难点2:把 类 当成数据类型来使用
    int n = 3;
	Student s = new Student("程咬金",20);
	3是整数
	程咬金是学生

对象三大特性-继承

继承不是把 父类 的成员变量和方法复制一份到 子类
而是利用 super 变量,往上找,自身的方法没有就找父类对象的方法,一直找到Object
	验证:创建子类对象,先创建父类对象

对象三大特性-多态

多态的前提条件:
    1.要有继承(要有父类和子类)才能形成多态
    2.重写父类的方法
    3.向上转型(父类声明的变量指向子类实例)
到底它调用父类子类方法:
    先看new出来的对象是谁?先找new出来的对象的方法。
    调用方法的参数传递,也会向上转型。

向上转型,向下转型

向下转型,前提是先向上转型,然后才能向下转型

案例

public class Person {
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		Person person=(Person) obj;
		if (this.name.equals(person.name)&&this.age==person.age) {
			return true;
		}else {
			return false;
		}
	}
}
public class DemoEquals {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setName("chen");
		p1.setAge(20);
		
		Person p2 = new Person();
		p2.setName("chen");
		p2.setAge(20);
		
		boolean b=p1.equals(p2);
		System.out.println(b);

		p2.setAge(18);
		b=p1.equals(p2);
		System.out.println(b);
	}
}
运行结果:
    true
    false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值