多态 转化

本文详细介绍了Java中的多态性概念,包括方法的多态性和类型转换。通过示例展示了父类引用指向子类对象时的调用规则,以及不能重写的情况。此外,还解释了`instanceof`操作符的使用和类型转换的注意事项,强调了类型转换时可能存在的方法丢失问题。
摘要由CSDN通过智能技术生成

目录

 多态:

父类Person

子类Student

 不能重写的情况:

测试类

instanceof (引用类型转换)

类型转换



 多态:


 1、多态是方法的多态,属性没有多态


 2、父类和子类,有类型


 3、多态存在条件:继承关系,方法需要重写,父类的引用指向子类对象!

父类Person

public class Person {
	public void run() {
		
	}

}

子类Student

public class Student extends Person{
	
	//重写 非静态方法
	@Override
	public void run() {
		System.out.println("son");
	}
	
	public void eat() {
		System.out.println("eat");
	}
	

}

 不能重写的情况:


 1、static 方法,属于类,它不属于实例


 2、final 常量


 3、private 方法


测试类

public class Application {
	public static void main(String[] args) {
		
	    //一个对象的实际类型是确定的
		// new Student();
		// new Person();
		
		//可以指向的引用类型就不确定了:父类指向了子类
		
		//Student 能调用的方法是自己的或者继承父类的方法
		Student s1 = new Student();
		//Person 父类型,可以指向子类,但是不能调用之类独有的方法
		Person  s2 = new Student();
		Object  s3 = new Student();
		
		s2.run();   //子类重写,执行子类方法 son
		s1.run();
		
		//s2.eat();该语句执行错误,因为s2指向父类,而父类没有eat函数
		//如果子类有重写(静态方法)eat函数 执行子类
		//如果子类没有重写(非静态方法)eat函数 执行父类
		((Student) s2).eat();  //强制转化,Person转Student
		s1.eat();
		
		
	}

}

//输出
//son
//son
//eat
//eat

instanceof (引用类型转换)

(1)先有继承关系,再有instanceof的使用。

(2)当该测试对象创建时右边的声明类型左边的类其中的任意一个跟测试类必须得是继承树的

同一分支或存在继承关系,否则编译器会报错。

//System.out.println(x instanceof y); 能不能编译通过!如果x和y有关系,就可以编译通过。

父类Person ,子类 Student,子类Teacher 

下面是测试类代码:

public class Application {
	public static void main(String[] args) {
	
		//System.out.println(x instanceof y); 能不能编译通过!
		
		//Object 相当于Person的爸爸类
		//Object > Person > Teacher
		//Object > Person > Student

	   Object object = new Student();
	   
	   System.out.println(object instanceof Student);  //True   这个是true是因为Object指向Student子类
	   System.out.println(object instanceof Person);   //True
	   System.out.println(object instanceof Object);   //True
	   System.out.println(object instanceof Teacher);  //false
	   System.out.println(object instanceof String);   //false

       System.out.println("======================");
	   
	   Person person = new Student();
	   
	   System.out.println(person instanceof Student);  //True
	   System.out.println(person instanceof Person);   //True
	   System.out.println(person instanceof Object);   //True
	   System.out.println(person instanceof Teacher);  //false
	  // System.out.println(person instanceof String);  //编译不通过

       System.out.println("======================");
	   
	   Student student = new Student();
	   
	   System.out.println(student instanceof Student);  //True
	   System.out.println(student instanceof Person);  //True
	   System.out.println(student instanceof Object);  //True
	   //System.out.println(student instanceof Teacher);  //编译不通过
	   //System.out.println(student instanceof String);  //编译不通过
		
	}

}

类型转换

注意:类型转换 高转低要强制转化,低转高不需要,强制转化可能会丢失方法

Person类只有run方法,Student类中只有go方法,下面是测试类代码:

public class Application {
	public static void main(String[] args) {
	   //高   -->   低  Person 类
	   Person student = new Student();
	   
	   //把Person 类 强制转化成 Student 类,并把新的Student类命名为students,不转化不能使用Student类中的go方法
	   Student students =(Student) student;
	   
	   students.go();
	   
	}

}

强制转化部分或者用一行代码解决:

((Student) student) .go();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值