4.面向对象
1.5.1 面向对象
1.5.1.1 类与对象
类是一个模板,它描述一类对象的行为和状态。定义类就是定义类的属性与行为(方法)。
1 | [ 权限修饰符] [ 修饰符] class 类名{ |
1 | public class Employee{ |
对象是类的实例,定义对象和定义变量一样。
1 | 类名 对象名 |
1.5.1.2 封装
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
优点:
良好的封装能够减少耦合。
类内部的结构可以自由修改。
可以对成员变量进行更精确的控制。
隐藏信息,实现细节
安全性高
封装之后才可以成为对象,真正的独立体
封装之后可以重复使用
1
2
3
4public class Person {
private String name;
private int age;
}
1.5.1.3 继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
1 | class 父类 { |
1.5.1.4 多态
多态是同一个行为具有多个不同表现形式或形态的能力。
优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
1 | package com.ydl; |
- 要有重写
- 有继承
- 父类引用指向子类对象
1.5.1.5构造方法
构造方法包含初始化类的成员变量的代码,当类的对象在创建时,它自动执行,不管谁创建类对象,构造方法被激活,成员变量被初始化。
特征:
它具有与类相同的名称
不能有返回值,写上void就是普通方法
它不能在用return语句返回一个值
构造方法必须与类名一致
public class Employee {
String EmployeeName; //姓名
int EmployeeNo=45; //编号
double Salary; //薪水
public Employee(){
}
1 | 调用: |
1.5.1.6 访问说明符和修饰符
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
1.final 修饰符:
- 一个final 不能被继承
- 一个final 不能被子类重载
- final 成员变量不能在被初始化后被改变
- 在final类里面所有的成员变量和方法都是final类型
2.abstract修饰符
- 类中包含一个明确声明的抽象方法
- 类中的任何一个父类包含一个没有实现的抽象方法
- 抽象类必须有子类
1.5.1.7方法的重载
- 方法名一样,形式参数不一样
- 方法的参数类型,参数个不一样
- 方法的返回类型可以不相同
- 方法的修饰符可以不相同
1 | public int add(int x,int y) { |
1.5.1.8this关键字
1 | public class Employee { |
1.5.1.9super关键字
使用super调用父类的方法和属性,super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
- 父类开始找,父类没有才开始找子类
1 | package com.ydl; |
1 | package com.ydl; |
1 | package com.ydl; |
1.5.2.0 toString方法
toString() 方法用于返回以一个字符串表示的 Number 对象值。
如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式
1.5.2.1 对象转型
- 向上转型:子类对象转为父类,向上转型不需要显示转化。Father father =son 向上转型会丢失子类原来有的特性。
- 向下转型:父类对象转为子类,向下转型需要强制类型转换。Son son=(son)Father
1 | public class Test { |
1.5.2.2 抽象类
用abstract关键字来修饰一个类时这个类就是抽象类。
- 抽象类必须使用abstract关键字来修饰,抽象方法也必须用abstract来修饰。
- 抽象类不能被实例化,不能使用new关键字生成对象。
- 抽象方法只需声明,不需实现
1 | public abstract class gh { |
- 类和类叫继承,类和接口之间叫实现。
- 继承使用extends 关键字。
- 实现用implements 关键字。
- 抽象使用abstract。
- 当一个非抽象类实现接口的话,必须将接口里面的抽象方法全部重写。
- 当一个非抽象类实现接口的时候必须将接口中所有方法加以实现。
- 一个类可以实现多个接口
- extends和implements可以共存,extends在前,implements在后。
- 使用接口,写接口的时候,可以使用多态(父类引用指向子类对象)
1.5.2.3接口
接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义。
- 接口是完成抽象的
- 接口支持多继承
- 接口中只包含部分内容,常量,抽象方法
- 接口中所有的元素都是public
- 接口中不能有方法体
1 | public interface 接口名{ |
1 | class 类名 extends 基类 implements 接口 接口{ |
1.5.2.4代码块
代码块又称初始化块,属于类中的成员,它讲的是逻辑代码块封装在方法体中通过{}包裹,代码块没有方法名,返回值,只有方法体,而且不通过对象和类进行调用,他会在类加载的时候调用,或创建对象的时候隐式调用。
- 静态代码块
一个类在加载的时候调用,做一些全局初始化的工作
1 | static{ |
2.实例代码块
每次创建实例都会被调用一次
1 | { |
1 | package com.ydl.template; |
1.5.2.4 静态方法和成员方法
静态方法的调用无论在那都是类名.方法名
静态方法中调用实例方法必须new一个对象。
1.5.2.4 内部类
内部类就是在类里面定义了一个类。
1 | package com.ydl.template; |
1.5.2.5 Java 异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
1 | 捕获异常 |
1.5.2.5throws/throw 关键字
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
下面方法的声明抛出一个 RemoteException 异常:
1 | import java.io.*; |
例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException:
1 | import java.io.*; |
1.5.2.1 集合
数组就是一个集合。其实集合就是一个容器。可以用来容纳其他类型的数据,集合是一个容器,是一个载体,可以一个容纳多个数据。
集合不能直接存储基本数据类型,也不能直接存储Java对象,集合中存储的Java对象的内存地址,也可以说是引用。
- 集合在Java中本身就是一个容器,是一个对象,也有内存地址。
- 集合在任何时候存储的都是一个引用。
- Java中每一个不同集合,底层都会对应不同的数据结构,往不同的集合中存储元素等于将数据放入了数据结构当中。不同的数据结构数据的存储方式不同。