Java 读书笔记8
来源:互联网 发布:网络卡盟 编辑:程序博客网 时间:2024/05/29 14:51
多态
动态绑定
- 也很好理解,简单地说,方法接受的是父类,方法里面具体用到的是什么就随便了
void test(Parent a) { a.find(); //此处的a可以使子类对象,那么test整体方法最后绑定就是动态的啦,否则它不知道到底是谁调用的; //该方法动态的绑定到了子类的find方法; }
父类的神奇作用
public class Art { Art (int i) { System.out.println("Art Constructior"); } void test() { System.out.println("art"); }}public class Drawing extends Art { public static void main (String arg[]) { Art a = new Drawing(); //父类引用用子类对象 a.test(); //a引用只能调用父类有的方法,但是如果子类幼虫在,那么调用子类方法; } void test() { System.out.println("aaa"); }}
public class Art { public static void main (String a[]) { Art art = new Drawing(); art.test1(); //编译器明确表示。这个test1()方法是私有的,就是Art自己的 } private void test1() { System.out.println("test1"); }}public class Drawing extends Art { public void test1 () //私有方法外面根本看不到,怎么可能重写。 { System.out.println("public"); }}
为什么会存在get/set方法?
public class Art { String a = "aaaaa"; void test() { System.out.println("art"); }}public class Drawing extends Art { String a = "bbbbbb"; public static void main (String arg[]) { Art a = new Drawing(); a.test(); //test调用的子类的 System.out.println(a.a); //属性a 是调用父类的 } void test() { System.out.println("aaa"); }}
为何会存在这样的问题呢?一个引用,他的方法使用子类,属性使用子类,这就是因为绑定,方法是动态绑定的,属性是前期绑定的,他不在乎你运行时是谁的;
因此我们一般将属性设置为私有(final),通过get/set方法实现调用值;由于方法是动态绑定的,我们就可以找到相应的值了;
为什么一定要从父类开始继承
首先,我们想一下,一个类中是可以没有构造方法的;如果没有的话,就会自动创造
public class Art { Art () { System.out.println("art"); }}public class Drawing extends Art { public static void main (String arg[]) { Drawing drawing = new Drawing(); //没有构造函数,自动调用父类构造函数,那么其实是他自己的默认构造函数调用了父类;因为什么?需要父类初始化啊;即便父类的构造函数也不存在初始化,也必须调用,万一初始化了呢; //另外,假设不调用父类,大概,就不能称之为子类了;因为你完全没有继承过程啊 }}
关于销毁顺序
其实也很好理解,创造是自上到下,销毁肯定是自下而上;
初始化的真实顺序
- 在所有之前,将分配给对象的存储空间初始化为二进制零;
- 从父类开始调用构造函数;
- 按照声明顺序调用成员的初始化;
- 子类构造函数主体开始
协变返回
目前不知道有啥用。。。。
用继承进行设计
class Actor { public void act() { } } class HappyActor extends Actor { public void act() { System.out.println("HappyActor"); } } class SadActor extends Actor { public void act() { System.out.println("SadActor"); } } class Stage { private Actor actor = new HappyActor(); //父类的神奇用法 public void change() { //类型转换 actor = new SadActor(); } public void performPlay() { actor.act(); } } public class Transmogrify { public static void main(String[] args) { Stage stage = new Stage(); stage.performPlay(); stage.change(); stage.performPlay(); } }
通过父类作为桥梁,就可以在子类之间变换;
一条通用的准则: 用继承表达行为间的差异,并用字段表达状态上的变化;
向下转型与运行时类别识别
public class Useful { public void f () { } public void g() { }}public class MoreUseful extends Useful{ public static void main(String a[]) { Useful [] x = { new Useful(), new MoreUseful() }; x[0].f(); x[1].g(); ((MoreUseful)x[1]).h(); //必须强制转换,我觉得说不定是在转换引用; } public void f(){} public void g(){} public void h(){}}
0 0
- 读书笔记8-《crazy java》
- Java 读书笔记8
- java读书笔记
- java 读书笔记
- Java 读书笔记
- java 读书笔记
- Java读书笔记
- java读书笔记
- Java 读书笔记
- Java读书笔记
- Java 2游戏编程读书笔记(8-1)
- 《Java编程思想》读书笔记(8)
- 《Java TCP/IP Socket编程》读书笔记(8)
- 深入Java虚拟机读书笔记(8-9)
- 【读书笔记】《Effective Java》(8)--异常
- 《THING IN JAVA》 8章多态-读书笔记
- 《java多线程编程技术核心》读书笔记8
- Java 8实战之读书笔记一:内容简介
- 35、C++对C语言的非面向对象的扩充
- 数据库原理-多值依赖
- [LeetCode]Find Bottom Left Tree Value 寻找二叉树最左树叶的值
- LeetCode 6 ZigZag Conversion 题解
- Python标准库05 存储对象 (pickle包,cPickle包)
- Java 读书笔记8
- 第13章.综合技术
- 欠拟合、过拟合及其解决方法
- 矩形覆盖
- 项目中Angularjs遇到的问题和优化总结
- 什么是TCP/IP
- 初学rnn(1)
- ubuntu 下 caffe 的安装
- 遍历一次实现单链表顺序反转