您的位置:首页 > 其它

一、面向对象的三大特性(深入)

2014-11-25 11:40 197 查看
在每个结果中增加了一个

Java编程中,面向对象是最基础的编程思想,面向对象的三大特性!——封装性、继承性、多态性
0)面向对象
面向对象即将实体抽象出来。举个栗子,比如说有
1)封装性
解释:封装性即意味这对象封装其内部的数据成员,使其对外不可见,以保证数据的安全性。

封装性即意味着对象封装其内部的数据,使其对外不可见,以保证数据的安全性。
2.继承性
3.多态性
1)封装性:封装性即意味着对象封装其内部的数据,使其对外不可见,以保证数据的安全性。


问题一:为什么要实现setter?

原理:封装的概念就是 自己的数据成员仅对自己可见,只有自己才能改变其值。

setter:改变数据成员值时,操作必须由这个对象自己触发;

public:改变数据成员值时,操作可以由任何对象触发;

实例:

public void setA(String a){
this.a = a;    (操作必须由这个对象自己 修改/触发 )
}


问题二:为什么要实现getter?

原理:因为数据成员用了private进行对外不可见,所以用getter。

问题三:getter怎么用?

原理:getter方法返回对象引用,返回可变对象的引用则破环了封装性。

方案:返回引用可变对象则采用克隆。 注意:日期(Date),数组(String[]),集合(List),键值对(Map)

实例:

public void getmDate(Date mDate ){
return mDate.clone() ;    (操作必须由这个对象自己 修改/触发 )
}
public static void main(String[] args){
Date date = mDate.getmDate() ;                        //通过getter获取对象引用
System.out.println("original:"+date.getTime());  //对象原始值

Thread.sleep(1000) ;    //休眠1秒

System.out.println("process:"+date.getTime());         //修改值
System.out.println("after:"+mDate.getmDate() .getTime());    //对象修改值
}


优点:更加方便管理。①setter只是进行赋值,而不是引用传递。故当修改传值参数时不会影响对象的数据成员(重点)

②当需要修改类数据成员的时候直接找到该类修改即可;

2)继承性:子类继承超类,实现代码复用。

问题一:什么叫向上转型?向上转型的方法调用?

原理: 子类创建的一个对象引用赋值给其父类变量,叫做向上转型。

(1)通过父类对象不能操作子类新增的成员变量,不能调用子类新增的方法;

(2)通过父类对象调用子类重写父类的方法时,调用的是子类重写后的方法;

实例:

/*
* Boy为子类,Father为父类
*/
public static void main(String[] args){
Father father = new Boy() ;   //向上转型
father.smile() ;                       //调用子类的smile()方法
}


问题二:什么叫向下转型?向下转型的方法调用?

原理:指向对应子类对象的引用的父类 强制转换为对应子类后 将该引用赋值给其子类变量,叫做向下转型。

(3)若将父类对象在强制转换为相应子类的对象,该子类对象又具备了子类所有的属性和方法;

实例:

/*
* Boy为子类,Father为父类
*/
public static void main(String[] args){
/*
* 错误示范
*/
Father father = new Father() ;
Boy boy = (Boy)father ;             //不安全的向下转型,编译无错但会运行会出错,抛出 java.lang.ClassCastException

/*
* 一般示范
*/
Father father = new Boy() ;  //向上转型
Boy boy = (Boy)father ;       //向下转型,编译和运行皆不会出错

/*
* 正确师范
*/
Father father = new Boy() ; //向上转型
if(father instanceof Boy){
Boy boy = (Boy)father ;       //安全的向下转型
}
}


问题三:为什么子类引用不能指向父类对象?
原理:java的机制。堆中父类对象不存在子类的某些方法以及变量,故导致转换缺失,抛出 java.lang.ClassCastException。

3)多态性: 多态性即多种形态。多态性的实现与静态联编、动态联编有关。
静态联编/静态绑定 支持的多态性称为编译时的多态性,也称静态多态性,它是通过重载实现的。重载
动态联编/动态绑定 支持的多态性称为运行时的多态性,也称动态多态性,它是通过继承和虚函数实现的。覆盖+对象变量多态

表现形式:①重载

②覆盖

③对象变量是多态的(因为父子类)。

问题一:什么叫静态多态性? 范围:private方法、static方法、final方法、构造器(不参与动态联编)

方案:静态联编是指在编译时,系统就能决定调用哪个函数。

原理:相同方法名称,根据参数类型或个数的不同调用对应的方法。

条件:重载,非继承

优点:方便调用,速度快。

问题二:什么叫动态多态性? 范围:Java中除了 private方法、static方法、final方法、构造器 外,其他的所有方法都是动态绑定的。
方案:动态联编是指在运行时,虚拟机调用 x所引用对象的实际类型 的 最合适的方法。

原理:首先会查找这个类实际引用,然后在查找对应的方法,如果方法在该类已经定义了则直接调用,否则则在该类的超类中查找对应方法,以此类推。

特例:如果调用super编译器会自动对超类方法进行搜索。

(动态联编虚拟机优化方案:每次调用方法都要进行搜索,时间开销相当大。因此,虚拟机预先为每个类创建了一个方法表,其中列出了所有方

法的签名和实际调用的方法。)

条件:覆写,继承,向上转型。

优点:无需对现存的代码进行修改,就可以对程序进行扩展。(直接将引用改为新增类即可)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: