2016.3.6学习多态:构造器、协变返回、继承、组合、向下转型
2016-03-06 10:29
309 查看
i++;
++i;
单独使用效果等于i=i+1;
但是赋值时:
a=i++; 效果为a=i,i=i+1;
a=++i, 效果为i=i+1,a=i;
构造对象顺序:分配给对象的存储空间初始化为0-父类成员初始化-父类构造函数-子类成员初始化-子类构造函数
dispose对象顺序:和创建完全相反
若创建子类对象时,父类构造函数调用了 一个已被子类覆盖的方法,则会调用子类方法,但会使用父类的成员(若没有则为0)。
关于finalize,当某个对象被barbage collection时,会发出警告,也就是finalize内的代码。
但请注意,不是说某对象失去引用就一定会被垃圾回收,所以必须使用System.gc()来强制回收。
编写构造器准则:用尽可能简单的方法使对象进入正常状态;尽量避免调用其他方法。除了private(默认final)和final方法
以参数列表情况来区别重载
协变返回
以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名(参数列表+方法名),包括返回类型也必须一样。
Java5.0后,子类方法的返回值是超类方法的子类型,就可以覆盖。
通过继承表达行为间的差异:比如一颗蛋,它就想变成一只天鹅。则继承得到不再改变的优雅和长脖子(行为)
通过组合表达状态的差异:比如一只老虎,今天伙食是food(){return new 天鹅()},明天伙食是food(){return new 鸡()}。则他更喜欢一颗能可变化的(多态)的new 蛋()
class Egg{
void ask(){
System.out.println("i am egg");
}
}
class Chicken extends Egg{
void ask(){
System.out.println("i am chicken");
}
}
class Duck extends Egg{
void ask(){
System.out.println("i am duck");
}
}
public class Tiger{
Egg egg=new Egg();
void eat(Egg e){
e.ask();
}
public static void main(String[] args) {
<pre name="code" class="java"> Tiger t=new Tiger;<span style="font-family: Arial, Helvetica, sans-serif;"> </span> t.eat(new Duck()); //ok today i can eat chicken}}
is-a:子接口=父接口
is-like-a:子接口>父接口,若向上转型,则无法调用扩展的接口
Father f=new Son(); //向上转型,不可用扩展接口
(Son)f; 向下转型。
++i;
单独使用效果等于i=i+1;
但是赋值时:
a=i++; 效果为a=i,i=i+1;
a=++i, 效果为i=i+1,a=i;
构造对象顺序:分配给对象的存储空间初始化为0-父类成员初始化-父类构造函数-子类成员初始化-子类构造函数
dispose对象顺序:和创建完全相反
若创建子类对象时,父类构造函数调用了 一个已被子类覆盖的方法,则会调用子类方法,但会使用父类的成员(若没有则为0)。
关于finalize,当某个对象被barbage collection时,会发出警告,也就是finalize内的代码。
但请注意,不是说某对象失去引用就一定会被垃圾回收,所以必须使用System.gc()来强制回收。
class A{ protected void finalize(){ System.out.println("no no no finalize"); } } public class hello{ public static void main(String [] args){ A a=new A(); A b=new A(); b=a; System.gc(); } }
编写构造器准则:用尽可能简单的方法使对象进入正常状态;尽量避免调用其他方法。除了private(默认final)和final方法
以参数列表情况来区别重载
协变返回
以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名(参数列表+方法名),包括返回类型也必须一样。
Java5.0后,子类方法的返回值是超类方法的子类型,就可以覆盖。
通过继承表达行为间的差异:比如一颗蛋,它就想变成一只天鹅。则继承得到不再改变的优雅和长脖子(行为)
通过组合表达状态的差异:比如一只老虎,今天伙食是food(){return new 天鹅()},明天伙食是food(){return new 鸡()}。则他更喜欢一颗能可变化的(多态)的new 蛋()
class Egg{
void ask(){
System.out.println("i am egg");
}
}
class Chicken extends Egg{
void ask(){
System.out.println("i am chicken");
}
}
class Duck extends Egg{
void ask(){
System.out.println("i am duck");
}
}
public class Tiger{
Egg egg=new Egg();
void eat(Egg e){
e.ask();
}
public static void main(String[] args) {
<pre name="code" class="java"> Tiger t=new Tiger;<span style="font-family: Arial, Helvetica, sans-serif;"> </span> t.eat(new Duck()); //ok today i can eat chicken}}
is-a:子接口=父接口
is-like-a:子接口>父接口,若向上转型,则无法调用扩展的接口
Father f=new Son(); //向上转型,不可用扩展接口
(Son)f; 向下转型。
相关文章推荐
- bp神经网络及matlab实现
- 合唱队(未完成)
- asp.net及IIS使用Oracle.DataAccess连接Oracle11g总结
- C#成魔之路<5>ADO.NET数据访问技术(1)
- 《构建之法》初步阅读
- 【CodeVS2226】飞行棋
- C++学习之Numeric overflow due to incorrect type casting
- C#第二节课
- 关于Graph-cut T-link 权值
- 【图像算法】图像特征:几何不变矩--Hu矩
- 四则运算1
- bc 74 Shortest Path
- 一个程序来比较cuda/c在GPU/CPU的运行效率
- 线程相关题
- 构建之法阅读笔记01
- Newton法(牛顿法 Newton Method)
- pat 1074 Reversing Linked List (25)
- HDOJ 1068 Girls and Boys(二分图匹配 + 镜像构图)
- 删除Android Studio中的module,或者Library。
- 爬虫神器xpath的用法(一)