Java编程思想读书笔记_第8章
覆盖私有方法
class Father {
private void f() { System.out.println("Father::f()"); }
public static void main(String[] args) {
Father father = new Son();
father.f(); //输出:Father::f()
}
} class Son extends Father {
public void f() { System.out.println("Son::f()"); }
public static void main(String[] args) {
Son son = new Son();
son.f(); //输出:Son::f()
}
}
上面例子中由于Father的f是私有的,所以在Father的main方法中对f的调用是静态绑定的。
如果把f定义为public的,则在Father中对f的调用将是动态绑定的。
域与静态方法
class Father {
public int i = 0;
public int get() { return i; }
} class Son extends Father {
public int i = 1;
public int get() { return i; }
public int get_super() { return super.i; }
} class Test {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.i); //0
System.out.println(f.get());//1
Son s = new Son();
System.out.println(s.i);//1
System.out.println(s.get());//1
System.out.println(s.get_super());//0
Son s1 = (Son)f;
System.out.println(s1.i);//1
System.out.println(s1.get());//1
System.out.println(s1.get_super());//0
}
}
对于成员函数的访问是没有多态的,子类型和父类型中的i是不同的存储空间。使用父指针访问的时候使用的父的空间,使用子指针访问的时候使用的是子的空间。
在构造函数中调用的函数如果是可以动态绑定的,并且在子类中被继承了,那么就会调用子类的方法
class Father {
void draw() { System.out.println("Father::draw"); }
Father() { draw(); }
} class Son extends Father {
int i = 1;
void draw() { System.out.println("Son::draw: " + i); }
} class Test {
public static void main(String[] args) {
new Son(); //Son::draw: 0
}
}
如果把Father中的draw定义为private的,那么在Test中的输出就是Father::draw
Java编程思想读书笔记_第8章的更多相关文章
- Java编程思想读书笔记_第7章
final关键字类似const: import java.util.*; public class FinalData { static Random rand = new Random(47); f ...
- Java编程思想读书笔记_第6章
如何创建一个包: 比如创建一个包名为com.huawei 则在一个目录下如(d:\java)创建目录com/huawei 然后在huawei目录下创建一个文件Assist.java package c ...
- Java编程思想读书笔记_第三章
本章提到的关于==的部分,一个完整的实验如下: class Test { public static void main(String[] args) { Integer i = new Intege ...
- Java编程思想读书笔记_第6章(访问权限)
四种访问权限: public private 包访问权限 protected 如果没有明确指定package,则属于默认包 package access.dessert; public class C ...
- Java编程思想读书笔记_第二章
java对于将一个较大作用域的变量“隐藏”的场景会有保护:编译告警.比如: int x = 5; { int x = 6; } 但是对于类中方法的局部变量和类成员变量确是可以重名的,比如 class ...
- java编程思想读书笔记 第十二章 通过异常处理错误(下)
1.异常的限制 当覆盖方法的时候,仅仅能抛出在基类方法的异常说明里列出的那些异常. 这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工资,异常也不例外. 以下的样例是在编译时施加在异常上面 ...
- JAVA编程思想读书笔记(五)--多线程
接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...
- JAVA编程思想读书笔记(四)--对象的克隆
接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...
- JAVA编程思想读书笔记(三)--RTTI
接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...
随机推荐
- 洛谷 P2033 Chessboard Dance
P2033 Chessboard Dance 题目描述 在棋盘上跳舞是件有意思的事情.现在给你一张国际象棋棋盘和棋盘上的一些子以及你的初始位置和方向.求按一定操作后,棋盘的状态. 操作有四种,描述如下 ...
- Linux MariaDB 遗忘密码后重置密码
Linux MariaDB 遗忘密码后重置密码 MariaDB 是 MySQL 的一个分支数据库.处理的办法和 MySQL 相同. 修改 MySQL 配置文件 在 [mysqld] 追加配置项: [r ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)
---------------------------------------------------------------------------------------------------- ...
- Cocos2d-X中的ProgressTimer
ProgressTimer即进度条,进度条在游戏开发中运用很广泛,比如在一些格斗游戏中,显示血液的变化,还有游戏载入进度,等都离不开进度条 Cocos2d-X中使用CCProgressTimer ...
- ios跟踪工具introspy使用
1.cydia安装introspy,前提要安装Applist (雷锋源) 2.设置中有introspy-Apps instrospy-Settings选项. 可以选择需要跟踪的app以及跟踪内 ...
- Android学习笔记-保存数据的实现方法2-SharedPreferences
Android下,数据的保存,前面介绍过了,把数据保存到内存以及SD卡上,这次我们就介绍一下,更为常用的采用SharedPreferences的方式来保存数据, 1,得到SharedPreferenc ...
- 【bug】【userAgent】极速模式与非极速模式存在差异
UC浏览器 Android 极速模式 UC浏览器 Android 非极速模式
- 杂项-Java:MyBatis
ylbtech-杂项-Java:MyBatis 1.返回顶部 1. MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundatio ...
- Yii2笔记一
环境LNMP,通过Composer安装 安装Composer(已经安装请跳过) curl -s http://getcomposer.org/installer | php #php可执行文件所在位置 ...
- Kafka详解与总结(七)-Kafka producer拦截器(interceptor)
1. 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor ...