01-什么是面向对象
面向对象的本质:以类的方式组织代码,以对象的组织(封装)数据
- 名词解释:
OOP:Object Oriented Programming
:面向对象编程
OOD: Object Oriented Design
:面向对象设计
OOA:Object Oriented Analysis
:面向对象分析
- 面向对象三大特性:
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
02-类与对象的创建
类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述、定义,但是并不能代表某一个具体的事物,如动物、植物、电脑等
- 对象是对抽象概念的具体实例,如张三、明朝那些事儿等等
创建与初始化对象
- 创建对象三步走
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字new来创建一个对象。
- 初始化:使用new创建对象时,会调用构造方法初始化对象。
public class Student {
public Student(String name) {
System.out.println("你的名字是:"+name)
}
public static void main(String[] args){
Student student = new Student("sanye");
}
}
- 创建对象时必须调用构造方法,构造方法和类名字相同,而且必须没有返回类型,也不能写void
03-构造器详解
- 定义:构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。
- 特点:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 使用new关键字,本质是在调用构造器
- 一旦定义了有参构造,无参构造就必须显示定义
public class MyClass {
private int m; // 定义私有变量
MyClass() {
// 定义无参的构造方法
m = 0;
}
MyClass(int m) {
// 定义有参的构造方法
this.m = m;
}
}
04-封装
该露的露,该藏的藏
- 程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
封装:数据的隐藏
- 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
封装:属性私有(private),通过get/set使用
实现Java封装的步骤:
- 修改属性的可见性来限制对属性的访问(一般限制为private)
- 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
优点:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 增加系统可维护性
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
05-继承
定义:
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
- extends的意思是扩展,子类是父类的扩展
格式
class 父类 {
}
class 子类 extends 父类 {
}
Java中类只有单继承没有多继承
super详解
super注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中!
- super和this不能同时调用构造方法!
super和this不同点:
- 代表的对象不同:this本身调用这个对象,super代表父类对象的应用
- 前提不同:this没有继承也可以使用,super只能在继承条件下才可以使用
- 构造方法不同:this()调用本类的构造,super()调用父类的构造
重写
-
需要有继承关系,子类重写父类的方法
-
子类和父 类的方法必须要一致,方法体不同
-
特点
- 方法名必须相同
- 参数列表必须相同,否则就变成重载了
- 修饰符的范围可以扩大:private–>default–>protected–>public
- 抛出的异常:范围可以被缩小,不能被扩大。
ClassNotFoundException 不能变成 Exception()
-
为什么需要重写
- 父类的功能,子类不一定需要或者不一定满足
06-多态
定义格式
同一个方法可以根据发送对象的不同而采用多种不同 的行为模式
定义格式:父类类型 变量名=new 子类类型();
注意事项:
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型就不确定了*
- 对象能执行哪些方法,取决于左边,与右边关系不大
- 多态是方法的多态,属性没有多态
- 父类可以指向子类但不能调用属于子类的方法
- 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
- 父类和子类之间有联系,转换错误会报类型转换异常
ClassCastException
存在条件:
- 继承关系,没有继承关系就不存在多态了
- 方法需要重写,带有static、final、private修饰的方法不能重写
- 父类的引用指向子类对象
instanceof关键字
**作用:**用来判断某个对象是否属于某种数据类型
**注意:**返回值为Boolean类型
Object o = new Student();
System.out.println(o instanceof Object); //true
System.out.println(o instanceof Person); //true
System.out.println(o instanceof Student); //true
System.out.println(o instanceof Teacher); //false
System.out.println(o instanceof String); //false
类型转换
- 父类引用指向子类对象
- 把子类转换为父类:向上转换
父类类型 变量名=new 子类类型();
- 把父类转换为子类:向下转换,强制转换
父类类型 变量名=new 子类类型();
- 方便方法的调用,减少重复的代码,提高利用率
抽象类
注意事项:
- 抽象类不能new,只能靠子类去实现它
- 抽象类中可以写普通的方法
- 抽象方法必须在抽象类中
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
07-接口
接口就是规范,定义的是一组规则,就像人间的法律,制定好后所有人都遵守
区分
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范,无法写方法
接口的声明
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
接口的特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的制定为public abstract(并且只能是public abstract,其它修饰符都会报错)
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
- 接口不能被实例化,因为接口中没有构造方法
- implements 可以实现多个接口
- 子类必须要重写接口中的方法