Java基础—02:面向对象的三个基本特征

面向对象的三个基本特征是:封装、继承、多态。


封装

封装:(包装,信息隐藏)就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节; 举例:人本身就是一个很好的封装。对外提供与其它类或者对象交互的必要接口,而将自身的某些属性和实现细节对外隐藏。java是通过关键字private,protected,包和public实现封装的。通过种方式,类对内部数据和方法提供了不同级别的保护,以防止被随意的调用或者更改。这样既保证了这正常交互,又保证了安全性。   我们一般是对属性进行私有化,对外提供公开的set/get方法(好处2),如果该属性需要安全性的判断 将这些代码写在set中(好处3)。

 

  • 为什么要封装?封装的好处有哪些:
  1. 提高了可重用性,每个类都是一个独立的整体,可在多种环境中使用。
  2. 类内部的结构可以自由修改。
  3. 可以对成员进行更精确的控制。
  4. 松耦合,隐藏了实现细节,只提供一个接口,提高了独立性,还便于调用。
  5. 隐藏信息,避免意外或随意的更改,提高了安全性。
  • 为什么使用set方法,而不直接赋值呢?

比如要修改某个属性的数据类型,属性要是在很多处使用的话不方便更改,但要是有set方法,只需要修改set方法的传参类型就可以了,无需修改使用了该类的客户代码。

  • 访问修饰符public、private、protected,以及不写(默认)时的区别?

当前类 -->  同包 -->  子类 -->  其他包

public > protected > package = default > private

 


继承

继承(面向对象中叫泛化):是一种共享机制,是使用已存在的类的定义作为基础建立新类的技术,已存在的类被叫做基类或超类(父类),新定义的类被称作派生类(子类),继承是单向的。

派生类 不仅 有从基类继承来的所有数据和方法,还有自定义的数据、方法。

分类:继承分为单继承和多重继承。单继承是指一个子类最多只能有一个父类。多继承是一个子类可以有二个以上的父类。由于多继承会带来二义性,在实际应用中应尽量使用单继承。Java语言中的类只支持单继承,而接口支持多继承。Java中多继承的功能是通过接口(interface)来间接实现的

 

派生类对象如何分配内存?

  • 数据成员:先继承,后自己。
  • 基类的私有数据:能继承,但不能直接访问,基类私有只可被基类访问。(派生类对象单元中有基类的私有数据,初始化的时候只能通过调用基类构造来完成)

派生类的构造方法:

  • 目的:初始化派生类对象。声明基类的公有或受保护数据;派生类自定义数据
  • 派生类对象的构造方法的调用:
  1. 若派生类中有super语句,通过super语句调用基类构造;基类构造方法执行完,再执行派生类构造的其他语句。
  2. 若派生类中无super语句,调基类无参构造,基类若无构造器,会自动生成一个无参构造;若需要带参调用基类方法,只能通过super语句。
  • super 的调用:super( )  //调用基类无参构造,可省;      super( 实参)//调用基类带参构造,不可省。

注意:1.哪个类中的数据在哪个类中初始化;  2.构造器只能被调用,不能被继承;  3.构造器不能被final。

继承中成员方法的调用:

  • 基类的私有方法只可被基类访问,派生类若要访问基类私有方法,必须先访问基类公有
  • 若派生类访问基类时加super,直接上基类,但首先得看访问权限。
  • super.方法名([实参])     //基类的方法名

继承的好处:

  1. 提高了代码的可复用性,减小代码和数据冗余,并且对功能进行复用和拓展.。
  2. 能清晰体现相关类间的层次结构关系。
  3. 使类和类之间产生关系----关联、共享、多态。
  4. 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

继承的缺点:

  1. 父类变,子类就必须变。
  2. 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
  3. 继承是一种强耦合关系。

什么是向上转型和向下转型?

  • 向上转型:继承是is-a的相互关系,猫继承与动物,这样将猫看做动物就是向上转型,即子类转换成父类。向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。例如:Animal  a = new Cat( ) 父类引用指向子类对象;
  • 向下转型:父类转换成子类则需要强制转换,因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。而且只有先经过向上转型的对象才能继续向下转型。例如:先Animal  a = new Cat( );才可以Cat c = (Animal ) a。而Animal  a = new Animal( );Cat c = (Animal ) a 则会抛出ClassCastException异常。

 

总结:

java程序初始化过程:父类静态变量、父类静态代码块子类静态变量、子类静态代码块父类非静态变量、父类非静态代码块、父类构造函数子类非静态变量、子类非静态代码块、子类构造函数

 


多态

多态是同一个行为具有多个不同表现形式或形态的能力。多态性是对象多种表现形式的体现。

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

多态的优点:

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性、灵活性
  • 3. 可扩充性
  • 4. 接口性

多态存在的三个必要条件:

  • 继承
  • 重写
  • 父类引用指向子类对象

多态的实现方式:

  1. 方式一:重写
  2. 方式二:接口  :一个接口,使用不同的实例而执行不同操作
  3. 方式三:抽象类和抽象方法

 

重写(Override)

重写(Overriding)子类对父类的允许访问的方法的实现过程 (方法体) 进行重新编写, 子类存在与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法。即外壳不变,核心重写!

好处:在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

                                                                                                                                                              --------菜鸟教程

方法的重写规则

  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为final的方法不能被重写。
  • 声明为static的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个方法,则不能重写这个方法。
  • 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

重载(Overload)

重载(overloading) 是在一个类中定义了多个方法名相同,而他们的参数的数量不同数量相同而类型和次序不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

最常用的地方就是构造器的重载

好处:根据提供的条件调用不同形参的重载方法,能够满足多种方法调用情况。

                                                                                                                                                           --------菜鸟教程   

方法的重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

特别注意:调用重载方法时,按照参数先严格匹配,在兼容匹配(char -> int , float -> double)。

重写与重载的区别:

区别点重写方法重载方法
子类与父类的一种多态性表现一个类的多态性表现
参数列表不变一定改变
返回类型不变可变可不变

 

 

 

 

 


如有错误,欢迎留言指正  * _ *

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值