面向对象—高级对象

本章内容

image
image

类的继承

理解继承的含义在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化)。

被继承的类称为父类(超类,基类),新的类称为子类(派生类)。

子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。


image

ava中只能单继承,也就是说每个类只能有一个直接父类;一个父类可以有多个子类。

其实,在继承关系中我们还能发现一个规律:子类是父类的一种,也可以说“子类就是父类”。如:人类就是动物,动物就是生物。记住这个定律对我们理解继承的概念非常有帮助。但是,反过来看,父类是子类的说法正确吗?

image

继承的语法和规则

示例 Employee.java Worker.java

[修饰符]class子类名extends父类名

image
image

☻ 练习 Officer.java TestOfficer.java

用java中类的继承机制,实现Officer类,并设计一个测试程序TestOfficer类,来访问Officer类

继承的好处

image

子类实例化的过程

子类实例化时先实例化其父类,然后实例化子类。

要先调用父类的构造器,父类构造器运行完毕,才调用子类的构造器。

如果实例化类D,说出构造器执行的顺序。

image

super和this关键字

super()

image

this()

作用:调用本类的构造器

只能写在构造器的第一行

在同一个构造器中super()和this()不能同时出现

子类实例化的过程

使用默认的构造器

在子类中的创建构造器 示例 Worker.java

在子类中创建构造器时,必须调用父类的构造器

子类可以在自己的构造器中使用super关键字来调用父类的构造器

super(参数1,参数2,…);

如果使用super关键字调用父类构造器,必须写在该子类构造器的第一行

如调用的是父类中无参的构造器,则可以不写super( )

如果子类中调用了父类无参的构造器,而父类中没 有无参构造器则系统编译出错

super.

指向父类的引用。

通过关键字super我们可以指定子类在构造时调用父类的哪个构造器,达到先实例化父类然后实例化子类的目的。

子类的构造器默认的调用父类无参构造器,即子类构造器中没有用super指明调用父类哪个构造器的话,实际上编译器会自动的在子类构造器第 一行加入代码super( );

this.

指向本类的引用。

我们知道子类在实例化时必须调用父类的构造器,实际上有的子类构造器

也可以先调用本类的其他构造器,然后再通过那个构造器调用父类的构造器

无论是调用父类的构造器还是子类的构造器,最终都是找到最顶级的父类自

上而下的实例化。只要中间环节有一个构造器没找到,这个子类就无法完成实例化

给定以下代码:

image
image

答案:A

Java包的概念

包的概念及应用

在Java中,包主要有以下用途 :

包允许将类组合成较小的单元

有助于避免命名冲突

包允许在更广的范围内保护类、数据和方法

包可以是类、接口和子包的集合

将类放入包中

package包名 ;

注意:

在java中位于包中的类,在文件系统中的存放位置,必须有与包名层次相对应的目录结构

package语句作为java源文件的第一条语句

每个源文件只能声明一个包

如果没有package语句,则默认为无名包

Java类库中常用的包

java.lang

Java语言包,任何程序中,该包都被自动导入。

java.awt

图形用户界面包

java.awt.event

图形用户界面事件处理包。

java.swing

跨平台轻量级组件包。

java.sql

数据库访问包。

java.io

这个包由对您的输入/输出操作有用的类组成。

java.util

该包提供了许多创建如:lists, calendar, date等所需要的类和接口。

java.net

该包提供了许多进行TCP/IP网络编程的类和接口。

import导入包中的类

包名.路径名

package test;

class Cat extends p08.Animal{…}

使用import关键字引入其它包中的类

package test;

import p08.Animal;

class Cat extends Animal{…}

位于同一包中的类可以直接访问

导入包中所有的类

import 包名.*;

导入子包中所有的类

import 包名.子包名.*;

导入包中的某个类

import 包名.子包名.类名;

权限访问操作符

使用访问权限修饰符对类的成员进行控制,在java中称为“封装”。

不过不要把封装理解为private,不要误认为不能访问成员才是封装。实际上对成员访问权限的任何控制(包括public)都可以称为封装机制。

构造器和类的权限通常为public;private权限最小,限制类外访问,一般把属性设为private,让其他类不能直接访问属性,达到保护属性的目的;friendly是默认权限,即不使用权限修饰符时,即为friendly,该权限声明的成员在类内以及在同一个包中的其他类可以访问;而protected所修饰的成员在类内、同一个包中、所在类的子类中都可以访问。

public > protected > friendly > private

封装

信息隐藏,隐藏对象的实现细节,不让用户看到

将东西包装在一起,然后以新的完整形式呈现出来

例如,两种或多种化学药品组成一个胶囊

将方法和属性一起包装到一个单元中,单元以类的形式实现

“隐藏属性、方法或实现细节的过程称为封装。”

隐藏类的实现细节

让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作

便于修改,增强代码的可维护性

可进行数据检查

示例 Employor.java TestEmployer.java

访问权限修饰符

image

用来控制类的成员和类的使用范围

类成员的访问权限修饰符:private、default、protected、public

类的访问权限修饰符:public、default

image

方法的覆盖
方法的覆盖(override)
重写(rewrite)
对从父类中继承来的方法进行改造
在子类继承父类时发生方法覆盖的规则
在子类中的覆盖方法与父类中被覆盖的方法应具有相同的方法名相同的参数列表(参数数量、参数类型、参数顺序都要相同)相同的返回值类型子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限示例Worker.java

引用数据类型的转换

上溯造型

向上转型(Upcasting)— 子类转换为父类,自动转换;

前提 — 具有继承或实现关系

向上转换损失了子类新扩展的属性和方法,仅可以使用从父类中继承的属性和方法

image

instanceof 运算符

其实经过上溯和下溯造型之后,我们很难知道某个引用到底指向哪种类型的对象了。

可以通过instanceof来判断该经过上溯转型后是哪一个子类的。

instanceof运算符的一般格式:

image

instanceof 运算符

判断一个类是否实现了某个接口

对象 instanceof 接口

判断一个实例对象是否属于一个类

对象 instanceof 类

它的返回值是boolean型的

简单来说,多态是具有表现多种形态的能力的特征

同一个实现接口,使用不同的实例而执行不同操作

image

多态(动态绑定、Polymorphism )
不同的对象对同一行为作出的不同响应多态存在的三个必要条件要有继承,或实现要有重写父类引用指向子类对象一旦满足以上3个条件,当调用父类中被重写的方法后,运行时创建的是哪个子类的对象,就调用该子类中重写的那个方法在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用相应的方法

多态的优点

简化代码
改善代码的组织性和可读性
易于扩展

static关键字

image

静态变量

所有对象共享

也称为类变量

用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在(参考java虚拟机视频)

两种方式访问:

直接访问:类名.属性;

实例化后访问:对象名.属性

image

静态方法

不需要实例化,可以直接访问

也称为类方法

两种方式访问:

直接访问:类名.方法名()

实例化后访问:对象名.方法名()

static方法的作用

简化方法的使用;

便于访问静态属性;

注意事项

静态方法里只能直接访问静态成员,而不能直接访问类中的非

静态成员静态方法中不能使用this、super关键字

静态方法不能被非静态方法覆盖,静态方法不能修饰构造器

image

静态代码块

一个类中由static关键字修饰的,不包含在任何方法体中的代码块

当类被载入时,静态代码块被执行,且只被执行一次

静态块经常用来进行类属性的初始化

image

单例模式

单例模式(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点

单例模式要点:

某个类只能有一个实例

它必须自行创建这个示例

必须自行向整个系统提供这个实例

单例模式实现:

拥有一个私有构造器

提供一个自身静态私有的成员变量

提供一个公有的静态公有的方法

image

final关键字
final可以修饰的元素:
类:不能被继承变量(属性和局部变量):

不能被重新赋值在声明时赋值,或在构造器中赋值系统不会对final属性默认的赋初始值

方法:不能在子类中被覆盖,即不能修改。

TestFinal.java在程序中经常使用的一些常量,如圆周率,没必要在程序中频繁的修改它那么我们可以:首先把它设置为静态static,多个实例共享该常量,没有必要每个对象保存一份;
其次,设置为final类型,赋值以后不能再改变;最后注意遵守常量命名规范,所有字母大写、单词之间用下划线。

抽象类

抽象类和抽象方法的概念

抽象类是抽象方法和非抽象方法的集合

[访问权限修饰符] abstract class 类名{ ……}

特殊情况

全部是抽象方法

全部为非抽象方法

image

抽象类和抽象方法的概念

抽象方法

只有方法声明,没有方法实现的方法

[访问权限修饰符] abstract 返回值类型 抽象方法名 (参数列表) ;

abstract class A{

abstract int method1(int a,int b);}

抽象类的规则

注意:

抽象类不能被实例化;其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;抽象方法不能为static;

在下列情况下,一个类必须声明为抽象类:

当一个类的一个或多个方法是抽象方法时;

当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;

当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;

接 口(interface)

接口的概念 示例 AudioDevice.java VideoDevice.java

接口中只包含常量和抽象方法,而没有变量和方法的实现

接口对类来说是一套规范,是一套行为协议;

接口不是一个类,不能实例化

image

接口的成员:

常量(字段)

抽象方法

image

注意:

接口不是一个类,没有构造器,不能被实例化

接口使用interface关键字来定义,而不是class

接口默认:

常量:public static final

抽象方法:public abstract

接口的概念

image

示例 VADevice.java

接口可以实现多继承:

用接口可以实现混合类型(主类型,副类型),java 中可以通过接口分出主次类型

主类型使用继承,副类型,使用接口实现

接口可以使方法的定义和实现相分离,降低模块间或系统间的耦合性

针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。

接口和类的关系

类实现接口 — implements

为了使用一个接口,你要编写实现接口的类

如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类

多个无关的类可以实现一个接口,一个类可以实现多个无关的接口

一个类可以在继承一个父类的同时,实现一个或多个接口

示例 Television.java

接口和类的关系

image

☻ 示例 Student.java Consumer.java Person.java

有一个Student类该类继承了Person类,并实现了Consumer接口该类具有String类型的属性school并有一个study方法,在该方法中,系统可打印出学生在那所学校学习并创建一个测试方法,测试Student类

image

接口与抽象类的对比

接口不能含有任何非抽象方法,而抽象类可以。

类可以实现多个接口,但只能有一个父类。

接口和接口之间可以多继承

image

抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法完全是抽象方法,是一套纯粹的规范。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象父类,但是无关的类可以实现同一个接口。

内部类

内部类特性

内部类就是定义在另一个类内部的类。

内部类对于同一包中的其它类来说,内部类能够隐藏起来。

注意

内部类可以访问其外部类中所有的属性和方法

无需创建外部类的对象,即可从内部类访问外部类的变量和方法。

必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。

如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。

不能定义static变量

内部类特性

示例Outer.java

image

一个类只会被这个类所调用,其他类不会使用他,你可以把它定义成一内部类,这样可以隐藏实现细节,避免错误的调用。

内部类特性

普通类的访问权限修饰符

default

public

内部类的访问权限修饰符

default

public

protected

private

示例 Outer3.java OuterTest.java

在Outer内访问Inner,只需如下:

Inner in=new Inner() ;

在Outer外访问Inner,必须如下:

Outer o =new Outer();//实例化外部类Outer.Inner oi = o.new Inner();//实例化内部类

静态内部类

用static标识的内部类为静态内部类。

静态内部类作为外部类的静态成员,不能访问外部类非静态成员。

非静态内部类只能定义非静态成员,而静态内部类可以定义静态成员和非静态成员。

使用Outer.Inner inn=new Outer.Inner()方式实例化静态内部类。

非静态内部类不可以使用上面的方式实例化。

局部内部类

在一个类的方法体中或程序块内定义的内部类

image
image

示例

image

在方法定义的内部类中只能访问方法中的final类型的局部变量。

本章重点总结

类的继承Java中的包和访问修饰符方法的覆盖引用数据类型的转换多态static关键字抽象类和接口final关键字。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继...
    863cda997e42阅读 661评论 0 1
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,132评论 0 2
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,537评论 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,778评论 0 10
  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 460评论 0 2