Java—隐藏封装、继承

封装

封装是面向对象三大特征之一(另外两个是继承和多态),指的是将对象的状态信息隐藏在对象内部不允许外部程序直接访问对象内部信息,而是通过提供的方法实现对内部信息的操作和访问

封装,两个方面的含义:把该隐藏(属性)的隐藏起来,把该暴漏(方法)的暴漏出来。这两个方面是通过Java提供的访问控制符来实现的。

Java提供了三个访问控制符:privateprotectpublic,分别代表三个访问级别。另外还有一个不加任何访问控制符的访问控制级别,提供了四个访问控制级别:

private、default、protect、public,访问控制级别依次变大。

其中default没有对应的访问控制符,当不用任何访问控制符修饰类或成员时,系统默认使用该访问控制级别。

private访问控制权限private修饰的类中成员(包括属性和方法)只能该类的内部被访问。private最适合用于修饰属性,使属性隐藏在类的内部,类的外部不能直接操作该类的属性。

default访问控制权限(访问控制权限):如果类中的一个成员(属性和方法)或者一个顶级类不使用任何访问控制符修饰,就称它是默认访问控制,default访问控制成员或顶级类可以被相同包其他类访问。

protected访问控制权限(子类访问权限):使用protected修饰的成员(属性和方法)既可以被同一个包中其它类访问,也可以被不同包中的子类访问。通常情况下,如果用protected来修饰一个方法,通常是希望其子类重写这个方法。

public访问控制权限(公共访问权限):如果一个成员或者一个顶级类用public修饰,这个成员或顶级类可以被所有类访问。

访问控制级别表

 

private

default

protected

public

同一个类中

同一个包中

 

子类中

 

 

全局范围内

 

 

 

访问控制符用于控制一个类成员是否可以被其它类访问,对于局部变量而言,其作用域在其所在的方法,不可能被其它类来访问,因此不能使用访问控制符来修饰。

顶级类可以使用访问控制符修饰,但顶级类只有两种访问控制级别:public和默认,不能使用privateprotected修饰,因为顶级类既不处于任何类的内部,也没有其外部类的子类了,因此privateprotected访问控制符对顶级类没有意义。使用public修饰的顶级类可以被所有类使用,如声明变量;不使用任何访问控制符修饰的顶级类只能被同一个包中的所有类访问。

如果一个java源文件里定义的所有类都没有使用public修饰,则这个源文件的文件名可以是一切合法的文件名。但如果一个java源文件里定义了一个public修饰的类,则这个源文件的文件名必须与public类的类名相同。

  Java类里属性的settergetter方法有非常重要的意义,例如一个类里包含了一个名为abc的属性,则其对应的settergetter方法名应为setAbcgetAbc(即将原属性名的首字母大写,并在前面分别增加setget动词,就变成settergetter方法名)。

访问控制符使用原则:

●类中绝大部分属性都应该使用private修饰,除了一些static修饰的、类似全局变量的属性才可能考虑使用public修饰。此外,有些方法只是用于辅助实现该类的其它方法,这些方法被称为工具方法,工具方法也应该使用private修饰。

●如果某个类主要用做其它类的父类,该类里包含的大部分方法可能仅希望被其子类重写,不想被外界直接调用,则应该使用protected修饰这些方法。

●希望暴漏给其他类自由调用的方法应该使用public修饰。因此类的构造器通过使用public修饰,暴漏给其他类中创建该类的对象。因为顶级类通常希望被其它类自由使用,所以的大部分顶级类都使用public修饰。


继承

继承,实现软件复用的重要手段。单继承、每个子类只能有一个直接父类。

继承特点:父类包含的范围总比子类包含的范围要大。父类是打雷,子类是小类。子类继承父类的方法属性、不能继承父类的构造器。子类扩展了父类,子类以父类为基础,额外增加新的属性和方法。

重写父类的方法:子类包含于父类同名方法的现象称为方法重写,也称方法覆盖。方法的重写要求:方法名同、形参列表同,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

当子类覆盖父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖方法:使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

父类private修饰的方法不能被子类访问,也即不能被子类重写。子类中定义了一个与父类private方法具有相同方法名、参数列表、返回值类型,依然不是重写,只是子类重新定义的一个新方法。

父类实例的super引用:在子类方法中调用父类被覆盖的实例方法,可使用super作为调用者来调用。Super是直接父类对象的默认引用。(java程序创建某个类的对象是,系统会隐式创建该类父类的对象,只要有一个子类对象存在,则一定存在一个与之对应的父类对象。Super引用和this引用很像,this总是指向调用该方法的对象,super则指向this指向对象的父对象。和this一样,super也不能出现在static的方法中。Static修饰的方法时属性类的,该方法的调用者可能是一个类,而不是对象,也就不存在父对象,所以super引用也就失去了意义。)

方法重载主要发生在同一个类的多个不同名方法之间,重写发生在子类和父类的同名方法之间。父类方法和子类方法之间也可能发生重载,因为子类会获得父类方法,如果子类定义了一个父类方法有相同方法名,但参数列表不同的方法,就会形成父类方法和子类方法的重载。

调用父类构造器:子类不会获得父类构造器,但有时候子类构造器里需要调用父类构造器的初始化代码,需要用super调用来实现。(一个构造器中调用另一个重载的构造器使用this来实现。Super调用的是其父类的构造器,this调用的是同一个类中重载的构造器。使用super调用父类构造器也必须出现在子类构造器执行体的第一行,所以this调用和super调用不会同时出现)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值