1.面向对象
1.1 什么是面向对象
面向对象是一种解决问题的思想,它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据(属性)和行为(方法),主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)。
1.2 面向对象的三大特性
面向对象的三大特性:封装,继承,多态。
简单来说:
1.将数据和操作数据的代码封装在一起,形成一个对象。
2.通过继承提取对象之间的共性,让新对象也可以拥有老对象的特性,实现代码的复用。
3.多态运行不同对象执行同一种操作产生各自不同的效果,增加了代码的灵活性。
4.抽象让你只关注对象的接口,而不用关心内部实现,简化复杂性。
本次我们主要陈述封装。
2.封装
2.1 什么是封装
封装是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅对外公开接口来和对象进行交互,从而实现功能。
2.2 封装的好处
1.数据隐藏:封装通过限制直接访问对象的内部属性,保护了数据不被外错误地修改和滥用。
2.接口和实现的分离:封装使得我们可以自由地改变一个类的内部实现,而不影响到使用该类对象的代码。
3.提高了代码的重用性:良好封装的类可以被不同的项目重用,因为它们提供了清晰的接口和明确的功能。
2.3 如何实现从封装
Java中主要通过类和访问权限来实现封装。
类可以将数据以及操作数据的方法封装结合在一起。
访问权限用来控制方法或者字段(成员变量)能否在类外使用。
2.3.1访问限定符
访问权限用来控制方法或者字段(成员变量)能否在类外使用。
Java提供了四种访问限定符:private,default,protected,public。
四种访问限定符的范围如下图所示:
public可以理解为一个人的外貌特征,大家都看到(不同包中的非子类)。
default可以理解为对于自己家庭内部(同一个包下) 事情,只有自己家庭内部的人知道,对于其他人就是隐私。
private可以理解为自己的秘密,只有自己知道(同一个包的同一个类下),其他人都不知道。
protected主要应用于继承中,我们暂时不做分析。
说明:
在权限限定符不写的情况下为默认权限,即default。
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。
2.3.2 构造函数和Getter,Setter函数
构造函数:
构造函数是类的初始化方法,它在创建对象时被调用。它可以用来设置对象的初始状态,确保对象在使用前被正确初始化。
Getter和Setter函数:
Getter和Setter方法是用来访问和修改私有属性的标准方式。它们不仅提供了访问控制,还可以在设置值之前添加验证逻辑。
我们以创建一个Student类为例,演示构造函数和Getter,Setter函数的实现。
public class Student { private String name;//成员变量 private int age; public Student() { }//无参构造函数 public Student(String name, int age) { this.name = name; this.age = age; }//有参构造函数 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }//Setter,Getter方法}
我们会发现:
Student类将数据(成员变量)name,age和操作数据的方法(成员方法)结合在了一起,private,public访问限定符实现了类中的成员变量和方法能否在类外使用,private的修饰的成员变量只能在该类内进行使用,不能直接被其他类使用,public修饰的成员方法,可以在很大的范围内被使用,这个过程就可以称为封装。
注意:
构造函数,不管是无参构造函数还是有参构造函数都是没有返回类型的 。
一般情况下成员变量设置为private,成员方法设置为public。
3.封装的扩展之包
3.1 什么是包
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
在Java中包是对类,接口等的封装机制的体现,是一种对类和接口等的很好的组织方法。
3.2 如何导入包中的类
通过上面包的定义我们知道,包中含有很多类和接口,那我们如何将这些类和接口导入到我们的项目中呢?我们有以下的方法:
1.通过确定类的完全限定名实现导包
全限定名包含包名和类名。
public class Test { public static void main(String[] args) { java.util.Date date=new java.util.Date(); System.out.println(date.getTime()); }}
2.使用import语句导入包
import java.util.Date;public class Test { public static void main(String[] args) { Date date=new Date(); System.out.println(date.getTime()); }}
如果想使用java.util包中的其他类,可以直接使用import java.util.*
import java.util.*;public class Test { public static void main(String[] args) { Date date=new Date(); System.out.println(date.getTime()); }}
3.3 自定义包
自定义包指我们自己创建的一个用于管理我们个人项目的包,主要用于管理各类和接口。
注意:
包名需要尽量指定成一个唯一的名字,通常会用公司或者学校的域名的颠倒形式(例如com.hkd.pojo)
包名要和代码路径相匹配。例如创建com.hkd.pojo的包,那么会存在一个对应的路径com/hkd/pojo来存储代码。
如果一个类中没有package语句,则该类会被默认放到一个默认包下。
3.4 常见的包
1.java.lang:包含Java核心类,如Object,String,Math,System,Thread等,这个包的类是自动导入的。
2.java.util:是java提供的工具程序包,提供了集合框架(如List,Set,Map),日期和时间API(如Date,Calender)等。
3.java.io:I/O编程开发包,包含File,InputStream,OutputStream,Reader,Writer等。
4.java.net:进行网络编程开发包。
5.java.sql:包含数据库操作的类和接口,如Connection,Statement,ResultSet等。