您的位置:首页 > 其它

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()来强制回收。

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; 向下转型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: