C#和Java在多态情况下对成员访问的比较
本文简单比较一下两种语言在里氏替换原则下,父类引用变量访问成员时的访问结果:
如果有两个类,如Person与Student,后者继承了前者,而且子类与父类有重名成员,当Person p = new Student();时,通过p.[重名成员]访问到的结果是什么呢?
Java
1. 多态情况下,如果子父类存在同名的非静态成员变量,那么访问的是父类的成员变量。
2. 多态情况下,如果子父类存在着同名的非静态的函数时,那么访问的是子类 的函数。
3. 多态情况下,如果子父类存在着同名的静态成员时,那么访问的是父类的成员。
4. 多态情况下,不能调用子类特有的成员。
总结:多态情况下(一定是在多态情况下,其它情况下无效),子父类存在同名 的成员时,默认都是访问父类的成员,
除了同名的非静态函数的时才是访问子类的成员。
class Animal{
int x = 10;
static String y = "动物";
public static void eat(){
System.out.println("动物在吃...");
}
public void move(){
System.out.println("动物在动...");
}
}
class Dog extends Animal{
int x = 20;
static String y = "狗";
public static void eat(){
System.out.println("狗在吃...");
}
//狗特有方法--->咬人
public void bite(){
System.out.println(name+"狠狠的咬....");
}
public void move(){
System.out.println("狗在动...");
}
}
class Demo5
{
public static void main(String[] args)
{
//多态:父类的引用类型变量指向了子类的对象
Animal a = new Dog();
a.bite();//报错,无法访问
System.out.println(a.x);//输出10
System.out.println(a.y);//输出动物
a.move();//输出狗在动
a.eat();//输出动物在吃
}
}
C#
1. 父类变量同样不能调用到所指向的子类对象独有的成员
2. 访问非静态成员变量或者方法时访问的都是父类的成员变量或方法
3. C#并不能直接通过对象来访问静态成员或方法
class Program
{
static void Main(string[] args)
{
Person p = new Student();
Console.WriteLine(p.name);//输出 Person 即访问非静态成员变量时访问的是父类的成员变量
p.SayHi(); //输出 Perosn 即访问非静态成员方法时访问的是父类的成员方法
Console.ReadKey();
}
}
class Person
{
public string name = "Person";
public void SayHi()
{
Console.WriteLine("Person");
}
}
class Student:Person
{
public string name = "Student";
public void SayHi()
{
Console.WriteLine("Student");
}
}
C#和Java在多态情况下对成员访问的比较的更多相关文章
- Java高并发情况下的锁机制优化
本文主要讲并行优化的几种方式, 其结构如下: 锁优化 减少锁的持有时间 例如避免给整个方法加锁 1 public synchronized void syncMethod(){ 2 othercode ...
- Java类什么情况下被初始化?
1.创建类的实例(new 的方式).访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法 2.反射的方式 3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需先触发其父类的初始 ...
- 使用ab.exe监测100个并发/100次请求情况下同步/异步访问数据库的性能差异
ab.exe介绍 ab.exe是apache server的一个组件,用于监测并发请求,并显示监测数据 具体使用及下载地址请参考:http://www.cnblogs.com/gossip/p/439 ...
- JAVA编程规范(下)
JAVA编程规范(下) 2016-03-27 6. 代码的格式化 6.1 对代码进行格式化时,要达到的目的 1. 通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解: 2. ...
- C++内存中的封装、继承、多态(下)
上篇讲述了内存中的封装模型,下篇我们讲述一下继承和多态. 二.继承与多态情况下的内存布局 由于继承下的内存布局以及构造过程很多书籍都讲得比较详细,所以这里不细讲.重点讲多态. 继承有以下这几种情况: ...
- ITerm2下使用ssh访问Linux
通常情况下,iTerm2访问远程Linux使用ssh,与Termial基本一样,方法如下: ssh <用户名>@<ip> 然后输入访问的密码即可.当然还有的时候需要指定访问端口 ...
- 发布.net 4.0的站点到IIS7.5下时无法访问
现象: 初始发布.net 4.0站点到IIS7.5下时,各种配置都完毕的情况下依旧无法访问.首页显示站点目录结构(注:开启目录结构访问后会显示这个错误,否则会提示开启),访问次级目录提示:Handle ...
- 1-Java继承中多态情况特性下变量,方法,静态方法的访问
在Java继承下,多态特性下类成员访问情况 /* 在继承中,变量时静态的绑定的,非静态方法是动态的绑定的,静态方法是静态绑定的 */ class Parent{ int number = 11; pu ...
- Java之HashMap在多线程情况下导致死循环的问题
PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象 当初学Java的时候只是知道HashMap<K,V& ...
随机推荐
- 版本控制工具——SVN
一.需求 需求之一:备份 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流 需求之二:代码还原 这个项目中需要一个很复杂的功能,老王摸索 ...
- 20155308 2016-2017-2《Java程序设计》课程总结
20155308 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:回答"我专业吗.我的老师.师生关系.代码问题"四个问题. 预备作业2 ...
- 20155325《Java程序设计》实验一(Java开发环境的熟悉)实验报告
实验一Java开发环境的熟悉-1 提交 Linux或Window或macOS中命令行下运行Java的截图 运行结果包含自己学号等证明自己身份的信息 实验一Java开发环境的熟悉-2 提交 Linux或 ...
- CF 1083 C. Max Mex
C. Max Mex https://codeforces.com/contest/1083/problem/C 题意: 一棵$n$个点的树,每个点上有一个数(每个点的上的数互不相同,而且构成一个0~ ...
- Nginx入门篇(五)之LNMP环境应用
一.LNMP组合工作原理 (1)用户通过浏览器输入域名请求Nginx web服务: (2)Nginx对请求的资源进行判断,如果是静态资源,则由Nginx返回给用户:如果是动态请求(.php文件),那么 ...
- cogs1341 永无乡
cogs1341 永无乡 打了一发替罪羊树. 鬼故事:替罪羊树去掉重构(变成裸的二叉排序树)依然跑得过= = 启发式合并.每次把小的里面所有东西往大的里面一丢,每个点最多被丢\(log_2n\)次(丢 ...
- EF中一对多的自反关系设置
对于一般的目录树,通常就是一对多的自反关系,一般会有一个PID,引用于这个ID,实体类代码类似于下: public partial class Catalog { public Cat ...
- 七、Django之Views
一.概述 视图就是python中的函数,我们通常也称为:视图函数. 视图一般被定义在“app/views.py”中. 视图负责接受Web请求(HttpRequest)URL,进行逻辑处理,并返回Web ...
- ffmpeg 压缩H265 Windows 硬件编码
硬件NVIDIA:ffmpeg.exe -i input.avi -c:v hevc_nvenc -preset:v fast output.mp4 软件 :ffmpeg.exe - ...
- CentOS安装输入法及kDE桌面
参考教程:https://jingyan.baidu.com/article/154b46317fdfce28ca8f419e.html