java基础14 多态(及关键字:instanceof)
面向对象的三大特征:
1.封装 (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值。或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用)
2.继承 (继承关系通过extends关键字体现)
3.多态 (父类的引用指向子类的对象,或者接口的引用类型变量指向接口实现类的对象)
1、多态的含义
父类的引用指向子类的对象,或者接口的引用类型变量指向接口实现类的对象
2、多态的应用
1.多态应用于形式参数的时候,可以接收更多类型的数据.
2.多态用于返回值时,可以返回更多类型的数据.
3、多态的好处
提高了代码的拓展性.
4、多态的弊端
虽然提高了扩展性,但是只能使用父类引用指向父类成员。
5、多态的前提
类与类之间有关系,继承或者实现
6、多态体现
1:父类引用变量指向了子类的对象
2:父类引用也可以接受自己的子类对象
7、类型转换场景的问题
java.lang.ClassCaseException.类型转换失败
8、附录
- 如果需要访问子类特有的成员,那么需要进行强制类型转换
- 1、基本数据类型转换:
- 小数据类型------>大数据类型 自动转换
- 大数据类型------>转小数据类型 强制类型转换
- 2、引用类型转换:
- 小数据类型------->大数据类型 自动转换
- 大数据类型------->转小数据类型 强制类型转换
9、实现关系下的多态
- 接口的引用类型变量指向接口实现类的对象
格式:- 接口 变量 = new 接口实现类的对象
例子:
- interface Dao { //接口的方法全部都是非静态的方法
- public void add();
- public void delete();
- }
- //接口的实现类
- class UserDao implements Dao{
- public void add(){
- System.out.println("添加员工!!!");
- }
- public void delete(){
- System.out.println("删除员工");
- }
- }
- class Demo2 {
- public static void main(String[] args) {
- //实现关系下的多态
- Dao d=new UserDao(); //接口的引用类型变量指向接口的实现类的对象
- d.add();
- d.delete();
- }
- }
10、实例
例子1:
- /*
- 1:Father类
- 1:非静态成员变量x
- 2:静态成员变量y
- 3:非静态方法eat,方法体输出父类信息
- 4:静态方法speak();方法体输出父类信息
- 2:Son类
- 1:非静态成员变量x
- 2:静态成员变量y
- 3:非静态方法eat,方法体输出子类信息
- 4:静态方法speak();方法体输出子类信息
- */
- class Father {
- int x = 1;
- static int y = 2;
- void eat() {
- System.out.println("开吃");
- }
- static void speak() {
- System.out.println("小头爸爸");
- }
- }
- class Son extends Father {
- int x = 3;
- static int y = 4;
- void eat() {
- System.out.println("大头儿子很能吃");
- }
- static void speak() {
- System.out.println("大头儿子。");
- }
- }
- class Demo10 {
- public static void main(String[] args) {
- Father f = new Son(); // 父类引用指向了子类对象。
- System.out.println(f.x); //返回结果:1
- System.out.println(f.y); //返回结果:2
- f.eat(); // 输出的是子类的方法
- f.speak(); // 输出的是父类的方法
- }
- }
解析:子类(Son)继承父类(Father)
1:创建Father f=new Son();
1:这就是父类引用指向了子类对象。
2:问f.x=?(非静态)
3:问f.y=?(静态)
4:问f.eat()输出的是子类还是父类信息?(非静态)
5:问f.speak()输出的是子类还是父类信息?(静态)
总结:
1:当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量
2:当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量 所以:父类和子类有相同的成员变量,多态下访问的都是父类的成员变量。
3:当父类和子类具有相同的非静态方法(就是子类重写父类方法),多态下访问的是子类的成员方法。
4:当父类和子类具有相同的静态方法(就是子类重写父类静态方法),多态下访问的是父类的静态方法。
例子2:
- //动物类
- abstract class Animal{
- String name;
- public Animal(String name){
- this.name=name;
- }
- public abstract void run(); //抽象方法
- }
- //老鼠类
- class Mouse extends Animal{
- public Mouse(String name){ //调用父类构造器,目的:获取成员变量name中的值
- super(name);
- }
- public void run(){ //重写父类的抽象方法
- System.out.println(name+"四条腿慢慢走");
- }
- public void dig(){//Mouse子类特有的方法
- System.out.println(name+"老打洞...");
- }
- }
- //鱼类
- class Fish extends Animal{
- public Fish(String name){
- super(name);
- }
- public void run(){ //重写父类的抽象方法
- System.out.println(name+"摇着尾巴游啊游...");
- }
- public void bubble(){ //Fish子类特有的方法
- System.out.println(name+"吹泡泡....");
- }
- }
- class Demo6 {
- public static void main(String[] args) {
- Animal a=new Mouse("米老鼠");//多态,父类的引用指向子类的对象
- a.run();
- //a.dig(); //报错
- Mouse m=(Mouse)a;//强制类型转换
- m.dig(); //如果直接用a.dig()的话,会报错,因为是多态(父类中没有dig()方法),所以要强制转换类型
- Animal a1=new Fish("金枪鱼");
- Fish f=(Fish)a1;
- print(f);
- }
- //需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法
- //instanceof
- public static void print(Animal a){//Animal a=new Fish();
- if(a instanceof Fish){
- Fish f=(Fish)a;
- f.bubble();
- }else if(a instanceof Mouse){
- Mouse m=(Mouse)a;
- m.dig();
- }else{
- System.out.println("输入错误");
- }
- }
- }
- //形状类
- abstract class MyShape{//抽象类
- public abstract void getLength(); //抽象方法
- public abstract void getArea(); //抽象方法
- }
- //圆形
- class Circle extends MyShape{
- public final static double PI=3.14; //常量
- double r;
- public Circle(double r){
- this.r=r;
- }
- public void getLength(){
- System.out.println("这是圆形的周长"+2*PI*r);
- }
- public void getArea(){
- System.out.println("这是圆形的面积"+PI*r*r);
- }
- }
- //矩形
- class Rect extends MyShape{
- int width;
- int height;
- public Rect(int width,int height){
- this.width=width;
- this.height=height;
- }
- public void getLength(){
- System.out.println("这是矩形的周长"+2*(width+height));
- }
- public void getArea(){
- System.out.println("这是矩形的面积"+width*height);
- }
- public void t(){
- System.out.println("来咬我啊!!!");
- }
- }
- class Demo5 {
- public static void main(String[] args) {
MyShape mp=new Circle(3.0);//多态,父类的引用指向了子类的对象- mp.getLength();
- mp.getArea();
47 //方法2
Circle c = new Circle(3.0);- Rect r = new Rect(5,8);
- MyShape m = new Rect(8,3);
- //m.t(); //报错,此处需要强制类型转换
- print(r);
- print(c);//new Circle(3.0)
- }
- //需求1.定义一个函数可以接收任意类型的对象,并且打印图形的面积与周长
- public static void print(MyShape s){//相当于:MyShape s=new Circle(3.0)
- s.getLength();
- s.getArea();
- MyShape m = getShape(1);
- }
- //需求2:定义一个函数可以返回任意类型的图形对象.
- public static MyShape getShape(int i){
- if(i == 1){
- return new Circle(2.0);
- }else if(i == 0){
- return new Rect(6,9);
- }else{
- return null;
- }
- }
- }
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:http://www.cnblogs.com/dshore123/p/8891998.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础14 多态(及关键字:instanceof)的更多相关文章
- Java基础十一--多态
Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...
- Java基础之多态和泛型浅析
Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...
- java基础(多态)_03
一.多态 1.概念:一个对象的多种形态 2.前提: a:必须有继承 b:必须有重写(只有重写才会有意义,没重写语法没错) 3.体现形式: 父类类型 变量名 = new 子类类型(): 4.注意事项: ...
- Java 基础(6)——关键字 & 标识符 & 转义字符
依然是基础的一天,看一看就好~ 关键字 之前就有说过关键字哦~ 注:关键字就是程序发明者规定的有特殊含义的单词. from Java基础(2) Java 中除了关键字以外还有暂时没有成为关键字的保留字 ...
- Java基础知识之常见关键字(1)
static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...
- Java基础知识之常见关键字以及概念总结
static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意: 静态方法只能访问静态成员 但是非静态成员可以直接访问静态成员 静态方法中不可用使用this, ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- java基础(2):注释、关键字、标识符、数据
1. 注释.关键字与标识符 大家可以安装一个文本编辑软件notepad++,有利于java代码的查看与编写. 1.1 程序注释 通常我们需要在源代码中添加文字用来对进行代码解释说明,但这些文字并不是J ...
- Java基础—private、this关键字及get/set方法
Java基础-private\this关键字以及get\set方法 1.private关键字 private关键字通常用来修饰成员变量用来保护原有数据的安全,比如在下面学生类中 然后在测试类中调用成员 ...
随机推荐
- bzoj2969 矩形粉刷 概率期望
此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...
- 【HDU5919】SequenceII(主席树)
[HDU5919]SequenceII(主席树) 题面 Vjudge 翻译(by ppl) 给一个长度为N的数列A,有m个询问,每次问 数列[l,r]区间中所有数的第一次出现的位置的中位 数是多少 题 ...
- POJ P1185 炮兵阵地 【状压dp】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...
- 表格隔行变色_jQuery控制实现鼠标悬停高亮
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- Codeforces 744C. Hongcow Buys a Deck of Cards(状压DP)
这题的难点在于状态的设计 首先显然是个状压,需要一维表示卡的状态,另一维如果设计成天数,难以知道当前的钱数,没法确定是否能够购买新的卡,如果设计成钱数,会发现状态数过多,空间与时间都无法承受.但是可以 ...
- 【bzoj4571】美味
Portal -->bzoj4571 Solution emmm持续智力康复.. 虽然说因为统计的是加上\(x\)的跟\(b\)异或的最大值所以可持久化trie用不了了 但是按位贪心的思想还 ...
- Yii2 控制器单独向view(layout)传值
Yii2,layout中使用Controller的值,Controller向layout传值的两种方式. yii2中在通过Controller向layout中传值,layout中访问Controlle ...
- js中字符串全部替换
废话不多说,直接发结果 在js中字符串全部替换可以用以下方法: str.replace(/需要替换的字符串/g,"新字符串") 比如: "yyyy-MM-dd-hh-mm ...
- 「Django」rest_framework学习系列-分页
分页a.分页,看第N页,每页显示N条数据方式一:使用PageNumberPagination创建分页对象,配合settings全局配置 views设置 from rest_framework.pagi ...
- synchronized 加锁Integer对象(数据重复)详解
场景描述:多线程输出1到100,对静态Integer对象加锁,synchronized代码块中操作Integer对象,发生线程安全问题(数据重复) 代码: public class MyRunnabl ...