第六章 面向对象、对象和类以及封装

文章目录

  • 第六章 面向对象、对象和类以及封装
  • 一、面向对象
    • 1.概念
    • 2.面向对象的三大特征
  • 二、对象和类
    • 1.基本概念
    • 2.Java中的对象
    • 3.Java 中的类
    • 4.创建对象
    • 5.访问实例变量和方法
    • 6.源文件声明规则
    • 7.匿名类
    • 8.内部类
  • 四、封装
    • 1.概念
    • 2.封装的优点
    • 3.实现Java封装的步骤

一、面向对象

1.概念

面向过程
面向过程是一种编程思想,意思是我们要做任何事,都需要亲力亲为,强调的是过程
比如,把大象装冰箱,一共分3步:

  1. 打开冰箱门
  2. 把大象放进去
  3. 关上冰箱门

面向对象
面向对象也是一种编程思想,相对于面向过程,我们可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化
把大象装进冰箱里,面向过程强调的是过程。而面向对象强调的是结果:

  • 什么样的冰箱?
  • 什么样的大象?
  • 谁负责把大象装进去?

我们可以看到,干活的主体并不是自己,自己变成了一个指挥者

再比如,当我们想吃一道菜的时候,我们不用考虑这道菜是怎么做的,怎么送达的,只需要点菜即可。传菜和做菜都有具体的对象来完成具体的功能,我们不需要关注实现的过程,只需要关注结果就好

这就是我们所说的面向对象的编程思想(OOP,Object Oriented Programming)

2.面向对象的三大特征

  1. 封装:把相关的数据封装成一个”类”组件
  2. 继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
  3. 多态: 增强软件的灵活性和重用性

二、对象和类

1.基本概念

对象
对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等


类是一个模板,它描述一类对象的行为和状态

下图中汽车为类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等

2.Java中的对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑
对比现实对象和软件对象,它们之间十分相似
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成

3.Java 中的类

类可以看成是创建 Java 对象的模板

通过上图创建一个简单的类来理解下 Java 中类的定义:

public class Dog {String breed;int size;String colour;int age;void eat() {}void run() {}void sleep(){}void name(){}
}

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型

一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法

4.创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  1. 声明:声明一个对象,包括对象名称和对象类型
  2. 实例化:使用关键字 new 来创建一个对象
  3. 初始化:使用 new 创建对象时,会调用构造方法初始化对象

下面是一个创建对象的例子:

public class Puppy{public Puppy(String name){//这个构造器仅有一个参数:nameSystem.out.println("小狗的名字是 : " + name ); }public static void main(String[] args){// 下面的语句将创建一个Puppy对象Puppy myPuppy = new Puppy( "tommy" );}
}

编译并运行上面的程序,会打印出下面的结果:

小狗的名字是 : tommy

创建对象时,内存经历了如下过程:

  1. 在栈内存中开辟一块空间,存放引用类型变量 p,并把 p 压入栈底
  2. 在堆内存中开辟一块空间,存放 Phone 对象
  3. 完成对象的初始化,并赋予默认值
  4. 给初始化完毕的对象赋予唯一的地址值
  5. 把地址值交给引用类型变量 p 来保存

5.访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();

6.源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则:

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明

类有若干种访问级别,并且类也分不同的类型:抽象类和 final 类等
除了上面提到的几种类型,Java 还有一些特殊的类,如:内部类、匿名类

7.匿名类

Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。
主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。
匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
匿名类语法格式:

class outerClass {// 定义一个匿名类object1 = new Type(parameterList) {// 匿名类代码};
}

8.内部类

Java 一个类中可以嵌套另外一个类,语法格式如下:

class OuterClass {   // 外部类// ...class NestedClass { // 嵌套类,或称为内部类// ...}
}

要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
嵌套类有两种类型:

  • 非静态内部类
  • 静态内部类

一个非静态内部类的实例:

class OuterClass {int x = 10;class InnerClass {int y = 5;}
}public class MyMainClass {public static void main(String[] args) {OuterClass myOuter = new OuterClass();OuterClass.InnerClass myInner = myOuter.new InnerClass();System.out.println(myInner.y + myOuter.x);}
}

由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现

四、封装

1.概念

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问
要访问该类的代码和数据,必须通过严格的接口控制
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性

2.封装的优点

  • 良好的封装能够减少耦合
  • 类内部的结构可以自由修改
  • 可以对成员变量进行更精确的控制
  • 隐藏信息,实现细节

3.实现Java封装的步骤

1)修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person {private String name;private int age;
}

这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

2)对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{private String name;private int age;
​public int getAge(){return age;}
​public String getName(){return name;}
​public void setAge(int age){this.age = age;}
​public void setName(String name){this.name = name;}
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突

【JAVA SE】第六章 面向对象、对象和类以及封装相关推荐

  1. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  2. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  3. 《编程机制探析》第六章 面向对象

    <编程机制探析>第六章 面向对象 面向对象(Object Oriented)是命令式编程的主流编程模型,其概念极其重要.可以说,命令式编程几乎就是面向对象的天下. 面向对象(Object ...

  4. Java学习笔记 六、面向对象编程中级部分

    Java学习笔记 六.面向对象编程中级部分 包 包的注意事项和使用细节 访问修饰符 访问修饰符的注意事项和使用细节 面向对象编程三大特征 封装 封装的实现步骤(三步) 继承 继承的细节问题 继承的本质 ...

  5. [深入理解Java虚拟机]第六章 Class类文件的结构

    在本章关于Class文件结构的讲解中,我们将以<Java虚拟机规范(第2版 )> (1999年发布,对应于JDK 1.4时代的Java虚拟机)中的定义为主线,这部分内容虽然古老,但它所包含 ...

  6. Java SE第8章 Java集合

    Java SE第8章 Java集合 1. 集合的概念和作用 2. 使用Lambad表达式遍历集合 3.Collection集合的常规用法 4. 使用Predicate操作集合 5.使用Iterator ...

  7. java基础(六章)

    java基础(六章) 一.for循环的使用场合 l  while循环--先判断,再循环 while(1.条件表达式){      //2.循环操作      //3.更改循环条件表达式 } l  do ...

  8. 速学堂(java)第六章编程题自写答案

    速学堂(java)第六章编程题自写答案 1. 编写程序接收用户输入分数信息,如果分数在0-100之间,输出成绩.如果成绩不在该范围内,抛出异常信息,提示分数必须在0-100之间. 要求:使用自定义异常 ...

  9. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...

最新文章

  1. 检查单 2014-06-20-01
  2. Python TeamViewer批量提交密码重置--分析与实现
  3. 项目开发经验谈之:项目到底谁说了算
  4. OUTLOOK 的PST文件和OST文件的区别
  5. 使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)
  6. xwpython aui 子窗口-Python/wxPython:AUI管理器,防止面板离开Fram
  7. P1280 尼克的任务
  8. MEncoder的基础用法—6.6. 改变电影大小
  9. pycharm怎样运行python_python – 如何使用PyCharm运行doctests?
  10. $(...).nicescroll is not a function报错分析
  11. python | 降水数据分析(Ⅰ) 绘制全国降水四季分布图
  12. 因为毕业半年挣了100万,帅地在CSDN被喷上热榜
  13. Win10邮箱管理QQ邮箱+163邮箱
  14. 几何分布GeometricDistribution
  15. AutoCAD 2021绿色中文精简版
  16. 作业盒子小学版android,作业盒子小学生官方版
  17. 二层网络的未来?starkgate 带你体验二层桥接
  18. 浙大与北大计算机考研分数线,2017浙大考研复试分数线及相关问题
  19. 互联网直播平台架构案例一
  20. 进销存软件|云ERP仓库管理系统软件源码开源可扫码

热门文章

  1. 浪潮服务器开启远程管理,浪潮服务器远程管理
  2. c# xls 复制一行_编写干净的C#代码技巧
  3. 人脸识别dlib库 记录
  4. 4.设计模式---单例模式(上)
  5. 一个标签的72变,打造一个纯CSS图标库
  6. JavaScript学习笔记之原型对象
  7. WPF学习之路(十一)布局
  8. 使用Google App Engine开始新的网站开发学习
  9. 在WinForm中使用Web Service来实现软件自动升级
  10. java实现创建窗口