Java基础十二--多态是成员的特点

Java基础十二--多态是成员的特点

一、特点

1,成员变量。

编译和运行都参考等号的左边。

覆盖只发生在函数上,和变量没关系。

Fu f = new Zi();
System.out.println(f.num);//是父类,答案是3

2,成员函数(非静态)。

编译看左边,运行看右边。

因为成员函数存在覆盖特性。

Fu f = new Zi();//
f.show();
输出的是子类里面的show方法

3,静态函数。

编译和运行都看左边。

静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉及对象。

Fu f = new Zi();//
f.show();
这里最后输出的是父类的show里面的内容。

Zi z = new Zi();//
z.show();

输出的是子类里面的show

二、实例

  1 /*
  2 多态时,
  3 成员的特点:
  4 1,成员变量。
  5     编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
  6     运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
  7     简单说:编译和运行都参考等号的左边。哦了。
  8     作为了解。
  9 覆盖只发生在函数上,和变量没关系。
 10 Fu f = new Zi();
 11 System.out.println(f.num);//是父类,答案是3
 12 没根据f的值(子类对象的地址)去找,而是根据f的类型去找。
 13 开发时不可能出现这样的情况,我父类有了,我子类就直接拿来用了,而且用的时候一般都已经向下转型了。
 14
 15
 16
 17
 18 2,成员函数(非静态)。
 19     编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
 20     运行时:参考的是对象所属的类中是否有调用的函数。
 21     简单说:编译看左边,运行看右边。
 22
 23     因为成员函数存在覆盖特性。
 24 Fu f = new Zi();//
 25 f.show();
 26 输出的是子类里面的show方法
 27 依赖的是对象,有对象才有成员函数,必须动态的绑定到指定的对象上,所以运行的时候是看子类,而编译的时候检查语
 28
 29 法错误,所以编译的时候检查父类,所以看父类。
 30 编译检查语法错误,运行时根据引用指向的地址运行。
 31
 32
 33
 34
 35 3,静态函数。
 36         编译时:参考引用型变量所属的类中的是否有调用的静态方法。
 37         运行时:参考引用型变量所属的类中的是否有调用的静态方法。
 38         简单说,编译和运行都看左边。
 39
 40         其实对于静态方法,是不需要对象的。直接用类名调用即可。
 41 Fu f = new Zi();//
 42 f.show();
 43 这里最后输出的是父类的show里面的内容,因为静态成员不需要对象,直接是被类名指向,都指向存静态方法的方法区,
 44
 45 而那个里面存的就是父类的show。
 46 Zi z = new Zi();//
 47 z.show();
 48 这里的zi是继承fu的,show方法是静态的
 49 输出的是子类里面的show
 50 其实可以理解为静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉及对象
 51 父类对象引用,就是指向父类的静态函数
 52 子类对象引用,就是指向子类的对象函数
 53
 54
 55
 56
 57 */
 58
 59 class Fu
 60 {
 61 //    int num = 3;
 62     void show()
 63     {
 64         System.out.println("fu show");
 65     }
 66
 67     static void method()
 68     {
 69         System.out.println("fu static method");
 70     }
 71 }
 72
 73 class Zi extends Fu
 74 {
 75 //    int num = 4;
 76     void show()
 77     {
 78         System.out.println("zi show");
 79     }
 80
 81     static void method()
 82     {
 83         System.out.println("zi static method");
 84     }
 85 }
 86
 87
 88
 89 class  DuoTaiDemo3
 90 {
 91     public static void main(String[] args)
 92     {
 93         Fu.method();
 94         Zi.method();
 95 //这个的实质是父类对象指向子类引用,就是有点像指针,f的值是子类对象的地址。
 96         Fu f = new Zi();//
 97 //        f.method();//输出是父类的静态
 98 //        f.show();//编译的时候检查的是父类,运行的时候以子类为主,show被覆盖,运行的子类的show
 99         //输出是子类的show,
100 //        System.out.println(f.num);//是父类,答案是3
101
102
103 //        Zi z = new Zi();
104 //        System.out.println(z.num);//是子类,答案是4
105     }
106 }

三、内存储存分析

Fu f = new Zi();

Fu f 在栈中定义了一个引用,也就是指针。

new Zi() 在堆中定义了一个对象,只不过这个对象有父类的那一部分成员。

1、如果用子类引用指向这个对象,全部访问的是子类的。

2、如果用父类引用指向这个对象,全部访问的是这个对象里面父类的,只不过父类函数被覆盖,所以导致成员是父类,函数时子类的。

肯定是根据指针类型去访问要访问的东西。猫肯定要去吃猫粮,狗才去吃狗粮。

时间: 2024-12-15 01:38:48

Java基础十二--多态是成员的特点的相关文章

Java基础(十二)之包和权限访问

软件包 软件包解决了两个类名字一样的问题.软件包就是一个"文件夹". 包名的命名规范:1.要求所有字母都小写:2.包名一般情况下,是你的域名倒过来写.比如baidu.com,package com.baidu; 编写Test.java: package mings; //将类防止到一个包当中 public class Test{ public static void main(String[] args){ System.out.println("Hello,package!

Python基础(十二) 类私有成员和保护成员

python中的protected和private python中用 _var :变量名前一个下划线来定义,此变量为保护成员protected,只有类及其子类可以访问.此变量不能通过from XXX import xxx 导入 __var;变量名前两个下划线来定义,此变量为私有private,只允许类本身访问,连子类都不可以访问. class perent_class(object): def __init__(self,name,protected,private): self.name =

java基础十二[集合与泛型](阅读Head First Java记录)

集合 List 知道索引顺序的集合,ArrayList.LinkedList.Vector三个子类实现了List接口 ArrayList ArrayList没有排序方法,可以用Collections.sort(ArrayList对象)进行排序,但是Collections.sort()里面的ArrayList必须是String类型的,否则无法通过编译,除非该类型也继承或实现了Comparable LinkedList 针对经常插入或删除中间元素所涉及的高效率集合 Set 去重,独一无二的,不允许出

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十二章:外部类与内部类成员覆盖详解 下一章 "全栈2019"Java第九十三章:内部类应用场景(迭代器设计模式) 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

Java基础十--接口

Java基础十--接口 一.接口的定义和实例 1 /* 2 abstract class AbsDemo 3 { 4 abstract void show1(); 5 abstract void show2(); 6 } 7 8 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用 9 另一种形式定义和表示,就是 接口 interface. 10 */ 11 12 //定义接口使用的关键字不是class,是interface. 13 //interface编译后还是.class文件,其实本质

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成

Bootstrap <基础十二>下拉菜单(Dropdowns)

Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 class .dropdown 内加上下拉菜单即可.下面的实例演示了基本的下拉菜单: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 下拉菜单(Dropdowns)</title> <li

Java Web 学习笔记 第三章 java基础(二)

第三章 java基础(二) 一.转义符 转义字符是"\",通过转义字符,可表示一些特殊的字符. 例如: '\n'  表示回车 '\t'   表示 制表符字符,一个制表符表示向右跳8-10个字符 '\\'   表示\ '\''   表示单引号 '\"'  表示双引号 "\u4e2d"表示unicode编码对应的字符(汉字:中). 二.布尔类型的概念和用法 boolean 类型用来表示肯定或否定两种可能. boolean 常用在分支语句.循环语句中. true