1. 面向过程&面向对象
1.1. 面向过程
是一种线性的,第一步做什么,第二步做什么......
适合处理简单的问题。
1.2. 面向对象
运用分类的思维模式,思考问题要先进性哪些分类,然后对这些类进行单独思考。
适合处理复杂的问题。
对于复杂的问题,需要从宏观的整体上进行分析,需要使用面向对象的思路分析整个系统。但具体到微观,仍需使用面向过程的思路去处理。
2. 什么是面向对象
本质:以类的方式组织代码,以对象进行组织(封装)数据。
对象,是具体的事物,类,是一个抽象的概念。
3. 类和对象的关系
3.1. 类
类是一种抽象的数据类型,他是对某一事物进行整体描述/定义,但并不能代表一个具体的事物。
3.2. 对象
对象的抽象概念的具体实现
4. 创建与初始化对象
使用new 关键字进行对象的创建,对象的属性会被初始化为默认值。
5. 构造器/构造方法
- 使用new关键字,本质上是调用构造器,用于初始化值
- 构造器,必须和类名相同,必须没有返回值,也不能写void
- 分为无参构造器和有参构造器,一旦定义了有参构造,必须显示的定义无参构造
- alt + insert 生成构造器快捷键
6. 面向对象的三大特性
6.1. 封装
- 高内聚:类的内部数据操作细节由自己完成,不允许外部干涉。
- 低耦合:仅暴露少量的方法给外部使用。
- 属性私有,get/set
- 意义:
4.1. 提高安全性,保护数据
4.2. 隐藏了代码的实现细节
4.3. 统一接口
4.4. 增加了系统的可维护性
6.2. 继承
- 继承的本质是对某一批类的抽象,如老师和学生类可以抽象为人类
- 使用extends关键字进行扩展,子类扩展父类,子类 is a 父类
- Java中只有单继承,没有多继承
- 子类会继承父类的所有除private的属性和方法
- ctrl + H打开继承树的快捷键
- Java中所有的类,都直接或间接的继承Object类
- super关键字,用于在子类中访问父类的属性。this关键字,调用自己的属性和方法。
- 实例化子类会先默认调用父类的构造器,且必须放在构造方法的第一个
- 方法重写,需要有继承关系,子类重写父类
a. 方法名必须相同,参数列表相同。
b. 修饰符的范围可以扩大,但不能缩小(public > protected > default > private)
c. 抛出的异常,范围只能缩小,不能扩大
d. 父类的引用可以指向子类
e. 只能重写非静态方法
// 主类
public static void main(String[] args) {
A a = new A();
a.test(); // A=>test 如果是static方法 输出A=>test
B b = new A();
b.test(); // A=>test 如果是static方法 输出B=>test
}
// 父类
public class B {
public void test(){
System.out.println("B=>test");
}
}
// 子类
public class A extends B{
public void test(){
System.out.println("A=>test");
}
}
6.3. 多态
- 同一方法可以根据发送对象的不同而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
- 多态是方法的多态,没有属性的多态
// 父类
public class Person {
public void run(){
System.out.println("Person");
}
}
// 子类
public class Student extends Person{
@Override
public void run() {
System.out.println("Student");
}
public void test(){
System.out.println("Student => test");
}
}
// 主方法
public static void main(String[] args) {
Student s1 = new Student();
s1.run(); // Student
s1.test(); // Student => test Student能调用自己和继承自父类的方法
// 父类型,可以指向子类,但不能调用子类的方法
Person s2 = new Student();
s2.run(); // Student 父类方法被重写
// 对象能执行哪些方法,主要看左边的类型,和右边关系不大
}
- 存在条件:必须有继承关系,并进行方法重写,父类的引用指向子类对象。
6.4. instanceof与类型转换
- A instanceof B 判断 A 是否是 B的实例对象 返回值为true/false
- 把子类转化为父类,向上转型,自动完成,可能会丢失一些方法
- 把父类转换为子类,向下转型,强制转换
7. 抽象类
- 使用abstract修饰的类,叫做抽象类,不能new,只能靠子类实现
- 使用abstract修饰的方法,为抽象方法,只进行声明,非抽象子类必须进行实现
- 抽象方法必须在抽象类中,抽象类中也可以有非抽象方法
8. 接口
- 接口只有规范,接口的本质是契约
- 接口中的所有方法都是public abstract的,所有属性都是静态常量
- 使用interface进行定义
- 接口必须要有实现类,使用implements进行实现,实现了接口的类,必须重写接口中的方法
- extends只能进行单继承,但implements可以实现多个接口
- 接口不能被实例化,没有构造方法