Java学习笔记11(面向对象四:多态)
多态:
举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person
多态体现为:父类引用变量可以指向子类对象
多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
举例:
public class Fu {
public void show(){
System.out.println("父类的show方法");
}
}
public class Zi extends Fu{
public void show(){
System.out.println("子类重写父类的show方法");
}
}
public class Test {
public static void main(String[] args) {
//利用多态性
//公式:父类类型(接口类型)变量 = new 子类的对象
Fu f = new Zi();
f.show();
}
}
//输出:子类重写父类的show方法
抽象类多态:
public abstract class Person {
public abstract void work();
}
public class Teacher extends Person {
public void work() {
System.out.println("Teacher在工作");
}
}
public class Test {
public static void main(String[] args) {
//抽象类多态
Person p = new Teacher();
p.work();
}
}
//输出:Teacher在工作
接口多态:
public interface Work {
public abstract void work();
}
public class Student implements Work{
public void work(){
System.out.println("Student在工作");
}
}
public class Test {
public static void main(String[] args) {
//接口多态
Work w = new Student();
w.work();
}
}
//输出:Student在工作
多态中成员方法的特点:
public class Fu {
int a = 1;
}
public class Zi extends Fu{
int a = 2;
}
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.a);
}
}
//输出:1
成员变量:
编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败
运行的时候,运行的是父类中的变量值
总结:编译运行全看父类
成员方法:
父类中没有声明或者定义的方法无法调用,
子类如果重写,调用的是子类方法,子类没有重写,调用父类方法
总结:编译看父类,运行看子类
instanceof关键字:
用于比较引用数据类型:
public class Test {
public static void main(String[] args) {
//Person p = new Student();
Person p = new Teacher();
boolean b = p instanceof Student;
System.out.println(b);
}
}
//输出:false
多态转型:
向上转型:
java是一种强制数据类型的语言,参与运算的数据,需要保证类型的统一
如Person p = new Student();
两个数据类型是不同的,但是成功运行
因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的
范围小的,看成是子类,范围大的,看成是父类
这里子类提升到了父类的类型
优点:可以调用子类和父类的共有内容
缺点:无法调用子类的特有内容
如果想调用子类的特有内容:
向下转型(类似以前提到的强制转型):
Student s = (Student)p;
由父类类型强制转回子类的类型
好处:可以调用子类特有的功能
转型的案例:
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫在吃");
}
public void catchMouse(){
System.out.println("猫在抓老鼠");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗在吃");
}
public void lookHome(){
System.out.println("狗在看家");
}
}
public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.eat();
a2.eat();
//向下转型,调用子类的特有方法
//使用if .instanceof. 为了确保安全性
if(a1 instanceof Cat){
Cat c = (Cat)a1;
c.catchMouse();
}
if(a2 instanceof Dog){
Dog d = (Dog)a2;
d.lookHome();
}
}
}
/*输出:
* 猫在吃
* 狗在吃
* 猫在抓老鼠
* 狗在看家
*/
Java学习笔记11(面向对象四:多态)的更多相关文章
- 疯狂java学习笔记之面向对象(四) - this关键字
Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- Java学习笔记:03面向对象-接口_多态
1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- Java学习笔记(十一)面向对象---多态
多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接受自己的子类对象. 代码体现 abstract class Animal { public abstract void eat(); } ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- Java学习笔记--关于面向对象的思考
1.不可改变的类生成对象以及变量的范围 2. 关键词this的使用 3.用类抽象的思想制作软件 4.通过关系模型建立类 5.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
随机推荐
- Java---Ajax在Struts2框架的应用实例
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 很久没有动过ajax了,趁此机会复习一下,写一个简单的例子 一.项目结构: 二.需要的jar包 三.具体代码: 1.web.x ...
- 牛腩新闻公布系统--学习Web的小技巧汇总
2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...
- Android View动画效果—透明效果,旋转效果(二)
一:动画效果 方法一:动画效果用AlphaAnimation类.直接加入 AlphaAnimation aa = new AlphaAnimation(0,1); //设置透明度 aa.setDura ...
- json文件_ajax
html源码代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- 【java】抓取页面内容,提取链接(此方法可以http get无需账号密码的请求)
package 网络编程; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutpu ...
- 【java】实例化对象的3种方式:new、clone、反射
实例化对象的3种方式:new.clone.反射
- iOS----------如何检查域名是否支持ipv6
http://ipv6-test.com/validate.php 这个地址 也可以检测到! 1.检查你所用到的库,像af 3.0以上什么的(不用改),其他的库自己去搜下是否支持ipv6吧. 2. ...
- 用VS2015写一个简单的ASP.net网站
第一步:打开VS2015,然后新建一个空的解决方案,其中解决方案的名称WebSiteTest可类似认为是本次网站的名称,系统会以该名称(WebSiteTest)生成一个文件夹,在WebSites文件夹 ...
- 数据库的SQL优化
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. (因为在条件查询条件添加索引,会直接被检索到列,会非常的快速) 2.应尽量避免在 wher ...