4.1 类的封装

封装指的是将东西包装在一起,然后以新的完整形式呈现。包含两个意义:

1). 把对象的全部属性和方法结合在一起,形成一个不可分割的独立单位(即对象)。

2). 信息隐藏,即尽可能隐藏对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。

封装的好处之一就是可以隐藏信息。“信息隐藏”是一种强大的技术工具,因为它能降低程序的复杂性。在创建类时,根据完成任务的需要创建许多属性和方法,而只有可被其他人访问的那些属性和方法才对外公开。

实现封装的步骤:

1).修改属性的可见性来限制对属性的访问

2).为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问

3).在赋值和取值方法中,降入对属性的存取限制

package aaa;

public class Teacher {
private int age;
public int getAge() {
return age;
}
public void setAge(int myage) {
if(age < 23) {
System.out.println("Wrong!");
this.age = 23;
}
else
age = myage;
}
public void introduceMy() {
System.out.println("Hello, everyone, I'm a teacher, " + age + "years old.");
}
public static void main(String[] args) {
Teacher t = new Teacher();
t.setAge(10);
t.introduceMy();
}
}

4.2 类的继承

通过继承可实现代码复用。Java中所有的类都是通过直接或间接地继承 java.lang.Object类得到的。子类可以重写父类的方法,或命名与父类同名的成员变量。但Java不支持多重继承,即一个类有且仅有一个父类。

4.2.1 继承的实现:

通过extends关键字。子类可以继承父类中访问权限设定为public、protected、default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。语法如下:

class SubClass [extends SuperClass]
{
... // 子类体
}

类继承示例:

package aaa;

class Box{
double width;
double height;
double depth;
Box(){ // 无参构造函数
width = -1;
height = -1;
depth = -1;
}
Box(double w, double h, double d){ // 有参构造函数
width = w;
height = h;
depth = d;
}
double volume() { // 计算体积
return width * height * depth;
}
}
class BoxWeight extends Box{ // BoxWeight 继承父类 Box
double weight;
BoxWeight(double w, double h, double d, double m){
width = w;
height = h;
depth = d;
weight = m; // 子类特有的属性
}
}
public class DemoBoxWeight {
public static void main(String[] args) {
BoxWeight mybox = new BoxWeight(10,20,15,34.3); // 初始化子类对象mybox
double vol;
vol = mybox.volume();
System.out.println("volume: " + vol);
System.out.println("weight: " + mybox.weight);
}
}

4.2.2 对象初始化的顺序

通常在实现子类的构造方法时,先调用父类的构造方法。在实现子类的 finalize()方法时,最后调用父类的 finalize()方法。即初始化过程总是由高级向低级进行,而资源回收过程则从低级向高级进行。

值得注意的是,当子类中没有显式定义构造方法时,会自动调用父类中无参的构造方法作为自己的构造方法来使用。

4.2.3 this 和 super 的使用

在Java中, this通常指当前对象, super则指父类

1). this 用法

最普遍的情况就是,在方法中某个形参名与当前对象的某个成员有相同的名字。

2). super 用法

当子类继承父类时,其成员变量和方法有可能与父类相同,当需要区分它们时,就可以在子类中使用关键字 super 来实现。

·用来访问父类被隐藏的成员变量。格式为: super.variable

·用来调用父类中被重写的方法。格式为: super.method( [paramlist] );

·用来调用父类的构造方法。格式为: super( [paramlist] );

4.3 类的多态

在Java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和由方法重写实现的动态多态性(运行时多态)。

1).编译时多态。在编译阶段,具体调用哪个被重载的方法,编辑器会根据参数的不同来静态确定调用相应的方法。

2).运行时多态。由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。

4.3.1 方法的重载

当两个方法名称相同而参数项不同时,那么认为此方法被重载,而此过程为“方法重载”。

调用重载方法时,Java将尝试调用一个参数类型和数量与此方法的参数类型和数量相匹配的方法。如果不完全匹配,Java的自动类型转换将解决此问题并调用正确的重载方法。

另外,Java也支持对构造方法的重载,这样一个类就可以有多个同名不同参的构造方法。当用new运算符来创建一个类的对象时,编译器会根据所提供的的参数个数以及类型来区分调用哪个构造方法。

public class DisplayNumber
{
void display()
{
System.out.println("无参方法!");
}
void display(int num1, int num2)
{
System.out.println("整型方法,两参数值为:" + num1 + " " + num2);
}
void display(double count)
{
System.out.println("浮点方法,参数值为:" + count);
}
public static void main(String [] args)
{
DisplayNumber dispObj = new DisplayNumber();
dispObj.display();
dispObj.display(30, 40);
dispObj.display(30.5);
}
}

4.3.2 方法的覆盖

在类层次结构中,当子类的成员变量与父类的成员变量同名时,子类的成员变量会隐藏父类的成员变量;当子类的方法与父类的方法具有相同的名字、参数列表、返回值类型时,子类的方法就叫做重写了父类的方法,当重写的方法被子类的对象调用时,它总是参考在子类中定义的版本,在父类中定义的方法就被隐藏。

class Square
{
int length;
Square(int len)
{
length = len;
}
void getPerimter()
{
System.out.println("正方形的周长为 " + (4 * length));
}
}
class Rectangle extends Square
{
int width;
Rectangle(int len, int wid)
{
super(len);
width = wid;
}
void getPerimter()
{
System.out.println("长方形的周长为: " + (2 * (length + width)));
}
}
public class CalculatePerimeter
{
public static void main(String [] arge)
{
Square sqObj = new Square(10);
sqObj.getPerimter();
Square rectObj = new Rectangle(10,12);
rectObj.getPerimter();
}
}

【Java】《Java程序设计基础教程》第四章学习的更多相关文章

  1. 【Java】《Java程序设计基础教程》第一章学习

    一.Java概述 1.介绍了Java语言的由来 2.Java语言的特点:简单.面向对象.分布式.高效解释执行.健壮.安全.结构中立.可移植.高效率.多线程.动态 3.Java语言的实现机制,引入虚拟机 ...

  2. 【Java】《Java程序设计基础教程》第二章学习

    一.标识符 Java 中标识符的使用有如下规定:(1)标识符由字母.数字.美元符号”$”和下划线”_”组成,除此之外的任何其他符号是不能作为标识符使用的.(2)标识符中的第一个字符不能为数字.  (3 ...

  3. PHP-----PHP程序设计基础教程----第四章数组

    4.1 初识数组 4.1.1 什么是数组 数组是一个可以存储一组或者一系列数值的变量.在PHP中,数组中的元素分两部分,分别为键(Key)和值(Value).其中,“键”为元素的识别名称,也被称为数组 ...

  4. PHP-----PHP程序设计基础教程----第三章函数

    3.1 初识函数 3.1.1 函数的定义 语法: function 函数名([参数1,参数2,......]) { 函数体 } (1)function:在声明函数时必须使用的关键字 (2)函数名:创建 ...

  5. 《码出高效:Java开发手册》第四章学习记录,内容想当的多,前后花了几天的时间才整理好。

    <码出高效:Java开发手册>第四章学习记录,内容想当的多,前后花了几天的时间才整理好. https://naotu.baidu.com/file/e667435a4638cbaa15eb ...

  6. [Learn Android Studio 汉化教程]第四章 : Refactoring Code

    [Learn Android Studio 汉化教程]第四章 : Refactoring Code 第四章 Refactoring Code    重构代码 在Android Studio中开发,解决 ...

  7. [ABP教程]第四章 集成测试

    Web应用程序开发教程 - 第三章: 集成测试 //[doc-params] { "UI": ["MVC","NG"], "DB& ...

  8. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  9. apue第四章学习总结

    apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxr ...

  10. 《Linux内核设计与实现》第四章学习笔记

    <Linux内核设计与实现>第四章学习笔记           ——进程调度 姓名:王玮怡  学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...

随机推荐

  1. PLSQL Developer 11 使用技巧(持续更新)

    PLSQL Developer 11 使用技巧 (持续更新) 目录(?)[-] 首先是我的颜色配置 常用快捷键 提升PLSQL编程效率 按空格自动替换 关闭Window窗口 PLSQL 实用技巧 TI ...

  2. 根据GSVA结果绘制不同组的趋势图

    首先需要将GSVA的矩阵结果转换成如下格式: 然后使用如下代码进行作图 infile <- "draw_pre_violin_heatmap.txt" data <- ...

  3. [转帖]IBM报告:多国央行考虑发行数字货币 最快5年内问世

    IBM报告:多国央行考虑发行数字货币 最快5年内问世 https://news.cnblogs.com/n/646001/ DCEP 中国央行可能是第一家发布 数字货币的央行 DCEP 是基于 UTX ...

  4. Windows 下升级 node & npm 到最新版本

    查询 Node 的安装目录where node 升级 Node:在官网下载最新的安装包,直接安装即可.https://nodejs.org/ 升级 npmnpm install -g npm 使用 n ...

  5. Prometheus入门到放弃(5)之AlertManager部署

    alertmanager与exporters.cadvisor一样,都是独立于prometheus项目,这里我们也使用docker方式部署alertmanager. 1.下载镜像 镜像地址:https ...

  6. 嵌入式02 STM32 实验01 端口复用和重映射

    内设与外设: 端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设? 内设:单片机内部集成的功能一般包括:串口模块.SPI模块(Serial Peripheral Interface  ...

  7. 在Python中创建和使用类

    编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...

  8. 解决sublime text3运行PyQt5代码不能显示窗口的问题

    如题,在sublime中写了GUI代码,Ctrl+B能运行,但是就是不能显示窗口. 解决办法:  找到路径C:\Users\superlee\AppData\Roaming\Sublime Text ...

  9. COCOeval接口使用

    COCOeval类简介 class COCOeval: # Interface for evaluating detection on the Microsoft COCO dataset. # # ...

  10. NIO开发Http服务器(1):项目下载、打包和部署

    最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...