面向对象编程(OOP)
以类的方式组织代码,以对象的形式封装数据。
核心:抽象
三大特性
- 封装
- 继承
- 多态
类和对象
从认识论角度考虑:先有对象后有类
对象是具体的事物,类是对对象的抽象。
从代码运行角度考虑:先有类后有对象
类是对象的模板。
方法
修饰符 返回值类型 方法名(……){方法体;return 返回值;}
参数列表
(参数类型 参数名)
抛出异常
throw
【修饰符】
可省略,可以是 public protected private static final abstract
public protected private 最多只能出现其中之一
final abstract 最多只能出现其中之一
方法的调用
-
静态方法static
直接调用
Student().say();
-
非静态方法
//实例化这个类 new Student().say(); //对象类型 对象名 = 对象值; Student student = new Student(); student.say();
-
静态方法和非静态方法
静态方法:和类一起加载
非静态方法:类实例化后才存在
无法直接在静态方法中调用非静态方法。
-
引用传递:对象,本质还是值传递
创建对象
//定义一个类
public class Student {
//属性
String name;
int age;
//方法
public void study(){
System.out.println(this.name+"在学习");
}
}
//类实例化后会返回一个自己的对象
//student对象就是一个Student类的具体实例
Stuudent student = new Student();
构造器
也称为构造方法,在创建对象时必须调用。
- 构造器必须与类的名字相同
- 必须没有返回类型(也不能写void)
实例化初始值
- 使用new关键字本质是在调用构造器
- 用来初始化值
- 一旦定义了有参构造,无参构造就必须显示定义(若没有定义构造器,编译器会默认生成无参构造)
快捷键alt+insert
三大特性
封装
属性私有
运用private关键字
提供一些可以操作这个属性的方法
提供一些public的get、set方法
get:获得这个数据
public String getName(){
return this.name;
}
set:给这个数据设置值
public void setName(String name){
this.name=name;
}
作用
- 提高程序安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护性增加
继承
快捷键Ctrl+H
-
关键字extends(扩展),子类是父类的扩展,子类继承父类
-
继承是类与类之间的一种关系,除此之外还有依赖、组合、聚合等
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类),
子类与父类之间,意义上讲应具有“is a”的关系
-
java中类只有单继承,没有多继承。
-
子类无法继承父类中私有的属性/方法,只能继承公有(public)的
-
在java中,所有的类都直接或间接的继承Object
关键词super
-
调用父类的属性或方法,但私有(private)的不能被继承(只能继承不能访问?)。
-
调用子类的构造器时,会在子类构造器的第一行调用父类构造器。
在构造器中时,调用构造器必须在构造器的第一行(?)
- super只能出现在子类方法或构造方法中
- super和this不能同时调用构造方法
重写:方法的重写(与属性无关)
静态方法与非静态方法区别很大,只有非静态方法能重写,而且必须是公有(public)的(?)。
- 重写需要有继承关系,子类重写父类的方法
- 方法名、参数列表均相同
- 修饰符关系可扩大但不能缩小
- 抛出异常的范围可以缩小不能扩大
通过final修饰的类不能被继承
多态
- 多态是方法的多态
- 父类和子类。必须有联系
类型强转
高转低(父类->子类)
- 父类引用指向子类对象
- 子类转为父类,向上转型,无需强转,可能会丢失一些方法
- 父类转为子类,向下转型,强转,可能会丢失一些方法
- 方便方法的调用,减少重复代码
强转可能丢失精度
static
public class Person{
//匿名代码块可以用来赋初值
//静态代码块只执行一次
{
System.out.println("匿名代码块");
}
static{
System.out.println("静态代码块");
}
public Person{
System.out.println("构造方法");
}
public static void main(String[] args){
Person person1=new person();
System.out.println("=========");
Person person1=new person();
}
}
/*执行结果
静态代码块
匿名代码块
构造方法
=========
匿名代码块
构造方法
*/
静态导入包
import static java.lang.Math.random
抽象类
关键词abstract
抽象方法只有名字,没有方法的实现
抽象类的方法靠继承它的子类实现
抽象类可以写普通方法
抽象类是个约束,不能new
接口
只有规范,无法写方法。接口都需要有实现类。
接口可以多继承,关键词interface。
-
接口中所有的定义都是public abstract
-
类可以实现接口,关键词implements
-
实现了接口的类需重写接口的方法
参考
[1]https://www.bilibili.com/video/BV12J41137hu?p=60