JAVA核心技术I---JAVA基础知识(多态)
一:类转型
类转型:子类可以转父类,父类不可以转子类(除非父类对象本身就是子类)
1.父类
public class Human {
public void say() {
System.out.println("Hello World");
}
public void eat() {
System.out.println("eat food");
}
}
2.子类
public class Men extends Human{
public void plough() {
System.out.println("Men is ploughing");
}
public void eat() {
System.out.println("Men is eating");
}
}
3.实现转型
public class HumanTest {
public static void main(String args[]) {
Men m=new Men();
m.eat();
//子类转父类
Human hm=m;
hm.eat();
hm.say();
//hm.plough();//The method plough() is undefined for the type Human
//父类转子类(前提该父类是子类转过去的)
Men m2=(Men)hm;
m2.eat();
m2.plough();
}
}
Men is eating
Men is eating
Hello World
Men is eating
Men is ploughing
4.问题:编译时报错和运行时报错
class Pencil {
public void write (String content){
System.out.println( "Write",+content);
}
}
class RubberPencil extends Pencil{
public void write (String content){
System.out.println("Rubber Write"+content);
}
public void erase (String content){
System.out.println( "Erase "+content);
}
}
执行下列代码的结果是哪项?
Pencil p=new Pencil();
(( RubberPencil) p).write("Hello");
C.运行时抛出异常 D.编译失败
强制转换是允许的,不过相当于会产生内存越界,导致运行时报错
二:多态
多态:子类转型为父类后,调用普通方法,依旧是子类的
1.父类
public class Human {
public void say() {
System.out.println("Hello World");
}
public void eat() {
System.out.println("eat food");
}
}
2.子类:对父类方法重写
public class Women extends Human{
public void weave() {
System.out.println("women is weaving");
}
public void say() {
System.out.println("Hello World,I am a women");
}
public void eat() {
System.out.println("Women eat food");
}
}
public class Men extends Human{
public void plough() {
System.out.println("Men is ploughing");
}
public void eat() {
System.out.println("Men is eating");
}
public void say() {
System.out.println("Hello World,I am a man");
}
}
public class Child extends Human{
public void eat() {
System.out.println("Child is eating");
}
public void say() {
System.out.println("Hello World,I am a Child");
}
}
3.多态实现
public class HumanTest {
public static void main(String args[]) {
Human[] HM= new Human[];
HM[]=new Men();
HM[]=new Women();
HM[]=new Child();
for(int i=;i<;i++) {
HM[i].eat();
HM[i].say();
}
}
}
Men is eating
Hello World,I am a man
Women eat food
Hello World,I am a women
Child is eating
Hello World,I am a Child
三:利用多态实现解耦
(一)父类实现解耦
public class HumanTest {
public static void main(String args[]) {
HumanSay(new Men());
HumanSay(new Women());
HumanSay(new Child());
HumanSay(new Child() {
public void say() {
System.out.println("Someone is eating");
}
});
}
public static void HumanSay(Human a) { //方法不是依赖某个具体子类,可以使用父类,抽象类,甚至接口来实现解耦
a.say();
}
public static void HumanEat(Human a) {
a.eat();
}
}
Hello World,I am a man
Hello World,I am a women
Hello World,I am a Child
Someone is eating
(二)接口实现:
1.接口
public interface Human {
public void say();
public void eat();
}
2.子类
public class Men implements Human{
public void plough() {
System.out.println("Men is ploughing");
}
public void eat() {
System.out.println("Men is eating");
}
public void say() {
System.out.println("Hello World,I am a man");
}
}
public class Women implements Human{
public class Child implements Human{
3.其他一样,结果相同
(三)抽象类实现
1.抽象类
public abstract class Human {
public abstract void say();
public void eat() {
System.out.println("Human is eating");
}
}
2.子类
public class Men extends Human{
public class Women extends Human{
public class Child extends Human{
3.调用方式一样,结果一样
JAVA核心技术I---JAVA基础知识(多态)的更多相关文章
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- Java核心技术 卷1 基础知识-第一天
基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- [Java面试三]JavaWeb基础知识总结.
1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- java 程序运行的基础知识【Java bytecode】
聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...
- Java Script 学习笔记 -- 基础知识
Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...
- Java学习1——计算机基础知识
本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.
- JAVA面试题相关基础知识
1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...
随机推荐
- Vmware 给虚拟机传脚本并执行
#_*_ coding:utf8 _*_ from pysphere import VIServer import ssl import re import sys import os import ...
- Matplotlib学习---用matplotlib画折线图(line chart)
这里利用Jake Vanderplas所著的<Python数据科学手册>一书中的数据,学习画图. 数据地址:https://raw.githubusercontent.com/jakevd ...
- python中的split()方法的使用
Python split()方法:通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等. l Str.split()默认以空格,换行\n,制 ...
- 最简单的spring boot web项目
搭建效果为: 直接在网页输入请求,在页面中显示一行文字:Hello,Spring Boot 与一般的wen项目不同的地方: 1.不需要配置web.xml 文件,但需要注解@SpringBootAppl ...
- Linux查看实时网卡流量的几种方式
Linux查看实时网卡流量的几种方式 来源 https://www.jianshu.com/p/b9e942f3682c 在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查 ...
- MT【310】均值不等式
(2014北约自主招生)已知正实数$x_1,x_2,\cdots,x_n$满足$x_1x_2\cdots x_n=1,$求证:$(\sqrt{2}+x_1)(\sqrt{2}+x_2)\cdots(\ ...
- zabbix3.4.6之自动发现与自动注册
在zabbix中添加新主机时,是需要手动添加,但在zabbix的Action里有两项功能,自动发现与自动注册,运用这两个功能中任意一个都可以实现自动添加机器,但添加的主机名是IP地址. 自动发现:添加 ...
- 2017蓝桥杯 省赛D题(方格分割)
6x6的方格,沿着格子的边线剪开成两部分.要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算:包括这3种分法在内,一共有多少种不同的分割 ...
- Cannot set property 'innerHTML' of null
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 看如下错误代码: 知道是加载的问题就好解决了
- 【CF131D】Subway
题目大意:给定一棵 N 个节点的基环树,求各个点到环的最小距离. 题解:除了找环的必须参数之外,对每个点维护一个 fa 即可. 代码如下 #include <bits/stdc++.h> ...
