首页 > 编程语言 >秦疆的Java课程笔记:71 面向对象 什么是多态

秦疆的Java课程笔记:71 面向对象 什么是多态

时间:2023-12-15 17:22:36浏览次数:41  
标签:run Student 子类 多态 Person 秦疆 s2 Java public

  • 多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(指向父类或者有关系的类。)
//父类=======================================
public class Person {
}
//子类=======================================
public class Student extends Person {
}
//测试类=====================================
import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {
	    Student s1 = new Student();  
		//父类的引用指向子类的对象  
		Person s2 = new Student();
		//同样,作为所有类的“祖宗”,Object也能指向子类的对象  
		Object s3 = new Student();
    }  
}
  • 在父类中添加一个方法run,此时我们可以在测试类中运行s2.run()
//父类=======================================
public class Person {
	public void run() {  
	    System.out.println("run");  
	}
}
//子类=======================================
public class Student extends Person {
}
//测试类=====================================
import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {
	    Student s1 = new Student();  
		Person s2 = new Student();
		Object s3 = new Student();
		s2.run();
    }  
}
====运行结果====
run
  • 这里子类继承了父类的方法,所以能够调用run()

  • 在子类中重写父类的run()方法,稍加修改,在测试类中运行s1.run()s2.run()

//父类=======================================
public class Person {
	public void run() {  
	    System.out.println("run");  
	}
}
//子类=======================================
public class Student extends Person {
	@Override  
	public void run() {  
	    System.out.println("son");   //重写后改变了输出
	}
}
//测试类=====================================
import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {
	    Student s1 = new Student();  
		Person s2 = new Student();
		Object s3 = new Student();
		s1.run();
		s2.run();
    }  
}
====运行结果====
son
son
  • 这时子类重写了父类方法,只执行子类的方法。

  • 再在子类中添加独有的方法eat(),然后在测试类中用s1s2分别调用eat()

//父类=======================================
public class Person {
	public void run() {  
	    System.out.println("run");  
	}
}
//子类=======================================
public class Student extends Person {
	@Override  
	public void run() {  
	    System.out.println("son");
	}
	public void eat() {  
	    System.out.println("eat");  
	}
}
//测试类=====================================
import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {
	    Student s1 = new Student();  
		Person s2 = new Student();
		Object s3 = new Student();
		s1.eat();
		s2.eat();   //报错可修改为`((Student) s2).eat();`
    }  
}
  • 此时s2.eat();报错,因为eat()方法是子类独有的,父类对象无法调用。

  • 使用IDEA自动纠正(快捷键:Alt+Enter),会将语句改为:((Student) s2).eat();,也就是将s2的引用类型从Person强制转换为Student

  • 秦疆老师:对象能执行哪些方法,主要看对象左边的类型,和右边关系不大。

  • 多态注意事项:

    • 多态是方法的多态,属性没有多态
    • 多态存在的条件:
      • 有继承关系。类型转换异常:ClassCaseException。说明父子类之间出现了问题。
      • 子类重写父类方法
      • 父类引用指向子类对象
  • 无法重写的方法:

    • static修饰的静态方法,属于类,不属于实例。
    • final修饰的常量,在常量池中。
    • private修饰的私有方法。

标签:run,Student,子类,多态,Person,秦疆,s2,Java,public
From: https://www.cnblogs.com/Acolyte/p/17903816.html

相关文章

  • 《Java编程思想第四版》学习笔记47--关于handleEvent
    (4)增加可以被handleEvent()方法测试事件的组件到练习3中。过载handleEvent()并在文字字段中为每个组件显示特定的消息。                                                ......
  • 无涯教程-Java - toUpperCase()函数
    该方法返回指定的char值的大写形式。toUpperCase()-语法chartoUpperCase(charch)这是参数的详细信息-ch  - 原始字符类型。toUpperCase()-返回值此方法返回指定的char值的大写形式。toUpperCase()-示例publicclassTest{publicstaticvoidmain(Str......
  • javaweb实现文件上传与下载功能
    本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下一、文件上传要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。上传大多数情况是通过表单的形式提交给服务器,使用<inputt......
  • JavaScript 浏览本地文件夹
    1.JavaScript浏览本地文件夹button.onclick=asyncfunction(){//给按钮绑定事件try{consthandler=awaitshowDirectoryPicker(//{//mode:'readwrite',//指定读写模式:读/读写//startIn:'documents'//......
  • Java定义类的参数时的一个注意事项
    我在做CS61B21sp的lab7时,为了实现BSTpublicclassBSTMap<KextendsComparable<K>,V>implementsMap61B<K,V>{}定义了一个类privateclassNode<K,V>{privateKkey;privateVvalue;privateNode<K,V>left,......
  • JavaScript-IndexedDB API
    概述随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。现有的浏览器数据储存方案,都不适合储存大量数据:Cookie的大小不超过4KB,且每次请求都会发送回服务器;LocalStorage在2.5MB到10MB之间(各家浏览器不......
  • Java核心知识体系8:Java如何保证线程安全性
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解Java核心知识体系7:线程不安全分析1Java内存模型(JMM)如何解决并发问题维度1:使......
  • 无涯教程-Java - isWhitespace()函数
    该方法确定指定的char值是否为空格,包括空格,制表符或换行符。isWhitespace()-语法booleanisWhitespace(charch)这是参数的详细信息-ch  - 原始字符类型。isWhitespace()-返回值如果传递的字符确实是空格,则此方法返回true。isWhitespace()- 示例publiccla......
  • 无涯教程-Java - isDigit()函数
    该方法确定指定的char值是否为数字。isDigit()-语法booleanisDigit(charch)这是参数的详细信息-ch  - 原始字符类型。isDigit()-返回值如果传递的字符确实是数字,则此方法返回true。isDigit()-示例publicclassTest{publicstaticvoidmain(String......
  • java动态调用webservice
    packagecom.smp.common;importserverInfo.ServerInfo;importjavax.xml.soap.*;importjavax.xml.transform.Source;importjavax.xml.transform.Transformer;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.stream.StreamResult;impo......