第七章总结

7.1 类的封装

 

封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类。本节将详细扫一扫,看介绍如何将类封装。

例7.1创建R1这个类,实现餐馆点菜的场景.

例7.2将厨师封装成cook类,实现餐馆点菜的场景.

 例7.3将厨师的属性和部分法方法用private修饰

7.2 类的继承的
继承在面向对象开发思想中是一个非常重要的概念,它使整个程序架构具有一定的弹性,在程序中复用已经定义完善类不仅可以减少软件开发周期,还可以提高软件的可维护性和可扩展性。本节将详细讲解类的继承。
在第6章中曾简要介绍过继承,其基本思想是基于某个父类的扩展,制定出一个新的子类,子米可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父可以说平行四边形类继承了四边形类

 例7.4将厨师对象封装在餐馆类中,顾客无法接触厨师的任何信息.

例7.5创建Pad2类,继承Computer类

例7.6创建Pad3类继承Computer2类,并重写父类的showPicture方法

例7.7创建Pad4类,继承Computer3类,重写父类方法,并使用super关键字代表父类方法

7.2.3 所有类的父类——Object类
在开始学习使用class关键字定义类时,就应用了继承原理,因为在Java中,所有的类都直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。当创建一个类 class Anything (时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的,可见Java中的每个类 等价于都源于java.lang.Object类,如 String、Integer等类都是继承于Object类;除此之外自定义的类也都继承于Object类。由于所 class Anything extends Object有类都是Object子类,所以在定义类时,省略了extends Object 


例7.8在项目中创建ObjectInstance类,在类中重写Object类的toSpring方法,并在组方法中输出该类的实例对象. 

 

1. getClass()方法
getClass方法是Objecet类定义的方法,它会返回对象执行时的Class实例,然后使用比实的用getName(0方法可以取得类的名称。
语法如下:
getClass ().getName () ;
可以将getClass()方法与toString0方法联合使用。


2. toString()方法
toString)方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际题用中通常重写toString0方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字形得连接时,将自动调用重写的toString0方法。

3. equals()方法

前面章节曾讲解过equals0方法,当时是比较“=”运算符与equals方法,说明“=”比较链是两个对象的引用是否相等,而equals方法比较的是两个对象的实际内容。带着这样一个理论看下面的实例。

例7.9项目中创建类OverWritrEqual类,在类的组方法中定义两个字符串对象,调用法刚发判断两个字符串对象是否相等

7.3.1 方法的重载 
 在第6章中曾学习过构造方法,知道构造方法的名称由类名决定,所构造方法只有一个名称,
但如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需Stanc要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到“方法重载”。
虽然方法重载起源于构造方法,但是它也可以应用到其他方法中。本节将讲述方法的重载。
方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。为了更好地解释重载,来看下面的实例。

例7.10在项目中创建类,在类中编写方法的多个重载形式,然后在组方法中分别输出这些方法的返回值

7.3.2向上转型
对象类型的转换在Java编程中经常遇到,主要包括向上转型与向下转型操作。本节将首先介绍向上转型。
因为平行四边形是特殊的四边形,也就是说平行四边形是四边形的一种,那么就可以将平行边形对象看作是一个四边形对象。例如,鸡是家禽的一种,而家禽是动物中的一类,那么也可以鸡对象看作是一个动物对象。

例7.11在项目中创建Quadrangle父类,再创建Parallelogram子类,并使 Parallelogan子特Quadrangle父类,然后在主方法中调用父类的draw)方法。

 7.3.3向下转型
通过向上转型可以推理出向下转型是将较抽象类转换为较具体的类。这样的转型通常会出现问题,例如,不能说四边形是平行四边形的一种、所有的鸟都是鸽子,因为这非常不合乎逻辑。可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。例7.12在Parallelogram子类的主方法中将父类Quadrangle的对象赋值给子类Parallelogram的对象的引用变量将使程序产生错误。

7.3.4 instanceof 关键字
当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生(CastExcetion异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类时象子类对象的实例。这个判断通常使用instanceof操作符来完成。可以使用instanceof操作符断一个类实现了某个接口(接口会在7.4节中进行介绍),也可以用它来判断一个实例对象是否个类。
instanceof的语法格式如下:
ayobjectinstanceof ExampleClass
myobject:某类的对象引用。
¥ExampleClass:某个类。
使用 instanceof 操作符的表达式返回值为布尔值。如果返回值为true,说明myobjet对家核心技术
ExampleClass的实例对象;如果返回值为false,说明myobject对象不是ExampleChass的注意:
instanceof是Java语言的关键字,在Java语言中的关键字都为小写。

例7.13在项目中创建 Parallelogram类和另外3个类 Quadrangle、Square、Anything。其中Parallelogram类和 Square类继承Quadrangle类,在Parallelogram类的主方法中分别创建这些类的对象,然后使用instanceof操作符判断它们的类型并输出结果。

7.4 抽象类与接口

通常可以说四边形具有4条边,或者更具体一点,平行四边形是具有对边平行且相等特性的特殊四边形,等腰三角形是其中两条边相等的三角形,这些描述都是合乎情理的,但对于图形对象却不能使用具体的语言进行描述,它有几条边,究竟是什么图形,没有人能说清楚

例7.14定义一个GoShopping类,该类中分别使用实现的WatlMarket子类和TaooaoMacket子类创建抽象类的对象,并分别给抽象类中的成员变量赋不同的值,使用shop方法分别输出结果,代码如下。

 

 

 

 

7.4.2 接口的声明及实现
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体.

7.4.1小节中遗留的问题,可以将draw0方法封装到一个接口中,这样可以让一个类既能维展密又能实现draw)方法接口,这就是接口存在的必要性。

例7.15在项目中创建QuadrangleUseInterface类,该类中,首先创建一个drawTest接口,该接口中定义一个公有的draw方法;然后创建两个类panaleogrmedsehneda承图防squareUseInterface,使它们分别实现drawTest接口,并分别实现接口中的draw(万法、然后在主方法中分别调用这两个子类的draw0方法。

 

7.4.3多重继承
 在Jaa中类不允许多重维承,但使用接口就可以实现多重继承,因为一个类可以同时实现3
接口,“这样可以将所有需要实现的接口放置在implcments 关键字后并使用逗号“”隔开,但这会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。

例7.16通过类实现多个接口模拟家庭成员的继承关系,比如,爸爸喜欢抽烟和钓鱼,妈妈 )欢看电视和做饭,儿子完全继承了爸爸妈妈的爱好。定义一个IFather接口,并在其中定义两个方放 intsmoking和goFishing,

 

 

 

7.4.3 多重继承
在Java中类不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时妈口,这样可以将所有需要实现的接口放置在implements关键字后并使用逗号“”隔开,在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。通过接口实现多重继承的语法如下:
class 类名 implements 接口1,接口2,…,接口n

如果是接口继承接口,使用extends关键字,而不是iplements关键字,例如

7.5 访问控制
前面多次提到了public、private、包等关键字或者概念,这些都是用来控制类、方法或者的访问范围的,Java中主要通过访问控制符、类包和final关键字对类、方法或者变量的访问范趣行控制,

7.5.1访问控制符
前面介绍了面向对象的几个基本特性,其中包括封装性,封装实际上有两方面的含义:把该藏的隐藏起来、把该暴露的暴露出来,这两个方面都需要通过使用Java提供的“访问控制符”来实现,本节将对Java中的访问控制符进行详细讲解

7.5.3final 关键字
1. final类
定义为final的类不能被继承。
如果希望一个类不允许任何类继承,并且不允许其他人对这个类进行任何改动,可以将这个类
设置为final形式。
final类的语法如下:
final class类名()
如果将某个类设置为final形式,则类中的所有方法都被隐式地设置为final形式,但是final类中的成员变量可以被定义为final或非fǐnal形式。

例7.17 在项目中创建FinalClass类,在类中定义doit0方法和变量a,

 

 例 7.18在项目中创建 FinalMethod类,在该类中创建Parents类和继承该类的Sub类法中分别调用这两个类中的方法,并查看fnal类型方法能否被覆盖。

 

 

例7.19 在项目的com.lzw包中创建FinalData类,在该类中创建Test内部类,并定义各种类型的final变量

 

例 7.20在项目的com.lzw包中创建 FinalStaticData类,在该类中创建Random类的对象。方法中分别输出类中定义的final变量al与a2

 

 

例 7.21在项目中创建OuterClass类,在类中定义innerClas 内部类和dot)方法,在生展创建OmarClass类的实例对象和doit()方法

例 7.22下面修改例7.21,在项目中创建Interfacelnner类,并定义接口Outnterfas类InnerClass实现这个接口,最后使doit)方法返回值类型为该接口。代码如下

 

.使用this 关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用 his关键字。例 7.23在项目中创建TheSameName类,在类中定义成员变量x,再定义一个内部类 hmmser,部类中也创建x变量,并在内部类的doit(方法中分别操作两个x变量。

例7.25在returm语句中编写返回值为一个匿名内部类。

静态成员,但是在非静态内部类中不可以声明静态成员。静态内部类有一个最大的特点,用外部类的非静态成员,所以静态内部类在程序开发中比较少见。
可以这样认为,普通的内部类对象隐式地在外部保存了一个引用,指向创建它的外部意。但如果内部类被定义为static,就会有更多的限制。静态内部类具有以下两个特点:
(1)如果创建静态内部类的对象,不需要创建其外部类的对象;
(2)不能从静态内部类的对象中访问非静态外部类的对象。
例如,定义一个静态内部类StaticInnerClass,可以使用如下代码:

例7.26在静态内部类中定义主方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值