面向过程与面向对象
- 面向过程
考虑步骤,第一步做什么,第二步做什么 - 面向对象(Object-Oriented Programming,OOP)
属性+方法=类
- 分类的思维模式,首先思考解决问题需要哪些分类,然后对这些分类进行单独的思考,最后,才对某个分类下的细节进行面向过程的思索
- 适合处理需要多人协作的问题
以类的方式组织代码,以对象的组织(封装数据) - 三大特性:封装,继承(子类得到父类的东西),多态(同一个事物的形态不一样)
- 对象:具体的事物;类:对对象的抽象
- 代码的角度:先有类,后有对象;类是对象的模板
方法的调用
- 静态方法:在另一个类中引用时,使用“类名.方法名”即可
- 非静态方法:在另一个类中调用时,使用new操作符将要调用方法所在的类实例化:
- new Student().sayHello();
- Student student = new Student();
student.sayHell0();
- 同一个类中,两个方法都是静态或非静态则可以互相调用,如果是一个静态一个非静态则无法互相调用,只能是非静态的调用静态的。
原因:静态方法和类一起加载,非静态方法要等类实例化后才存在。 - 形参和实参
- 值传递:实际参数和形式参数类型要对应
此时a仍为1 - 引用传递:传递对象
此时person是一个对象,指向的是Person类
第一个打印的是”null“,第二个打印的是更改的值
类与对象的关系
- 类是一种抽象的数据类型,对某一类事物整体描述/定义,但是并不能代表某一具体的事物。一个类中只能存在属性和方法两种。
- 对象:抽象概念的具体实例
- 使用new关键字创建的对象,会分配内存空间并进行默认初始化以及对类中构造器的调用。
- 类是抽象的,必须实例化后才能使用。类实例化后会返回一个自己的对象。
类 对象 = new 类(); - 类种的构造器也成为构造方法,有以下两个特点:
- 必须和类名字相同
- 必须没有返回值类型
一个类即使什么都不写,也会存在一个方法
Alt+insert+construct可自动生成一个构造方法
创建对象内存分析
- main()方法一开始在栈的最底下
- 然后再是对象
对象的引用
引用类型:除了八大基本类型以外的所有类型;对象是通过引用来操作的:栈—>堆
封装
- “高内聚,低耦合”:
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅暴露少量的方法给外部使用
- 封装(数据的隐藏):禁止直接访问一个对象中数据的实际表现,通过操作接口来访问
- 属性私有,get/set
- 通过private私有类中的变量(属性),此时另外的类无法直接调用该类中的变量(属性)。
- 提供一些可以操作这个属性的方法,提供一些public的get、set方法,例:
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
Alt+insert可以自动生成get,set方法
可以在get,set方法中做一些安全性的检查,规避掉不合法的数据设置
- 意义:
- 提供程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口,调用接口都是get,set
- 增加了系统的可维护性
继承
定义
本质是对某一批类的抽象
public class Student extends Person{}
子类是父类的扩展,JAVA中类只有单继承,没有多继承,即一个子类只能直接继承一个类
注意父类中的方法是public时,子类才可以调用
ctrl+h可以展现继承结构,JAVA中所有类都默认继承Object类,故所有类都可调用Object类中的方法
super & this
super注意点:
- super是调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或构造方法中
- super和this不能同时调用构造方法
VS this: - 代表的对象不同,this代表调用的对象本身;super代表父类对象的应用
- this没有继承也能用,super只能在继承条件下使用
当父类有无参构造时,可以不用super(),子类的无参构造会默认调用父类的无参构造。当父类只有有参构造时,子类无法进行无参构造,因为他无法调用父类的无参构造了。
方法的重写
与属性无关,不等于重载。
- 如果用静态方法,则不会出现方法重写。
- 故前提是非静态且public的方法,父类和子类中方法(方法名和参数列表)一模一样,方法体不同,则称为方法的重写。
- 修饰符子类对于父类的范围可以扩大,但是不能缩小。(例:父为private,子可以扩大为public)。public>Protected>Default>private
- 抛出的异常:范围可以被缩小,不能被扩大。
重写存在的意义:
父类的功能,子类不一定需要或满足。
快捷键: Alt+insert+override
多态
同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的,但是他可以指向的引用类型不确定。例:
Person s = new Student();//父类的引用指向子类
对象能执行哪些方法看对象左边的类型。两个类型都有的话则执行子类的方法。
- 多态是方法的多态
- 父类和子类,有联系才能转换,否则类型转换异常:ClassCastException!
- 存在条件:继承关系;方法重写;
- 有些方法不能被重写:静态方法(属于类,不属于任何实例);final(常量);private(私有方法)
instanceof和类型转换
instanceof(类型转换)引用类型,只能转换有关系的类型
父 instanceof 子 或 子 instanceof 父(子与父要与属性实际类型有关)
其中,子 instanceof 父没必要,因为可以在实例化中直接转换类型,例:
Person s = new Student();//父类的引用指向子类
也可以在s前加子类类型,例:
(Student) s
子类转换为父类,可能会丢失自己本来的一些方法。
static关键字详解
- 变量:静态变量可以直接使用类名访问,可以被类中所有方法共享;非静态变量只能通过对象调用。
- 方法:非静态方法可以调用静态方法和非静态方法;静态方法只能调用静态方法。
- 代码块:
匿名代码块:创建对象时创建,在构造方法之前;
静态代码块:类一加载就直接执行,永久只执行一次。
实行顺序:静态代码块->匿名代码块->构造方法 - 静态导入包:导入后可以不在方法前加类名,直接调用方法即可
import static java.lang.Math.random;
抽象
- 抽象类:通过abstract修饰的类即抽象类,其中可以写普通方法。
- 抽象方法:只有名字,没有方法体;一定要在抽象类中。
- 抽象类的所有方法,继承了它的子类,都必须实现它的方法。
- 不能new这个抽象类,只能靠子类实现,是一个约束。
- 存在构造器,可以用来提高开发效率
接口
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范,实现约束和实现分离
接口声明的关键字是interface
接口中的所有定义都是抽象且public的,都需要有实现类。定义的属性都是常量,public static final,即一定是一个静态的常量,一般不在接口中定义属性。
实现接口的类,必须重写接口中的所有方法。该实现类可以实现多个接口。例:
package com.oop.demo03;
/**
* @author soso
* @PackageName:com.oop.demo03
* @ClassName:UserServiceImpl
* @Description:
* @date 2024/8/2517:59
*/
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
}
接口的作用:约束;定义一些方法让不同的人实现;接口不能被实例化,因为接口中没有构造方法;implements可以实现多个接口;实现类必须重写接口中的方法