JavaSE基础-10.面向对象
Lin
xiaominglin789面向对象
本质: 以类的方式组织代码, 以对象的组织(封装)数据、
抽象-提取成
类
3大特征:
- 封装
(高内聚,低耦合)
- 高内聚: 类的内部数据操作细节自己完成。
- 低耦合: 仅暴露少量的方法给外部使用。
- 继承
- 本质: 对某一批类的抽象。
- 子类 extends 父类
- 子类是父类的拓展。
- 多态
- 动态编译
- 封装
- 类与对象
- 类: 抽象,模板
- 对象: 一个具体的实例
- 方法
- 定义、调用
- 对应的引用
- 引用类型 vs 8大基本类型
- 对象是通过引用来操作的: 栈(地址) -> 堆(数据)
- 引用类型 vs 8大基本类型
- 属性: 字段,成员变量
- 默认初始化
- 数字: 0 或 0.0
- char: u0000
- boolean: false
- 引用类型: null
- 私有属性: get/set
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 提高系统的可维护性
- 默认初始化
- 方法
- 对象的创建和使用
- 必须使用
new
关键字创建对象 - 构造器
- 对象的属性
- 对象的方法
- 必须使用
实例化-new
- new 本质: 调用类的构造方法
- 默认构造方法
- 重载有参构造方法
- 如果定义了有参构造器,要使用无参构造器,要显示定义
public class Student {
public String name;
public int age;
// 默认无参构造器-显示定义
public Student() {}
// 重载-有1个参数的构造器
public Student(String name) {
this.name = name;
}
// 重载-有2个参数的构造器
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void study() {
System.out.println(this.name + " 凌晨5点就开始学习!");
}
}
继承
子类继承父类的所有东西,但只能使用父类的public/protected属性和方法
所有的类,都
默认
直接或间接继承Object
类的。单继承机制,
儿子
只能有"一个亲爸"、super: 继承关系时,子类构造时要最先调用
super()
,super. 调用父类的public/protected属性- super 调用父类的构造方法,必须在构造器方法的第一行
- super 必须只能出现在子类的方法或构造器方法中
- super() 和 this() 不能同时调用构造方法、
- this 本身调用者这个对象
- super 代表父类对象的引用
- this 没有继承也能使用
- super 只能在继承条件下使用
- this() 本类的构造
- super() 父类的构造
方法的重写
- 继承关系,子类重写父类的方法
- 方法名、参数必须相同
- 修饰符可以变大不能缩小: public/protected
- 抛出异常的访问: 范围,可以缩小,不能变大。
查看层级结构: 'Ctrl' + 'H'
class Person {
private int money = 10_0000_0000;
Person() {}
public void say(String what) {
System.out.println("父类say方法: " + what);
}
}
public class Student extends Person {
private String name;
private int number;
private char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Student() {
super();
}
@Override // 重写注解
public void say(String what) {
System.out.println("子类的say方法: " + what);
}
// 本类方法
public void study() {}
// 本类方法
public void sleep() {}
}
多态(类似javascript的this指向,可以指向不同的引用)
动态编译: 类型-可拓展性
同一个
方法
可以根据发送对象
的不同
而采取多种不同
的行为方式一个对象的实际类型时确定的, 但是 可以指向对象的
引用
类型有很多(父类、有关系的类)多态存在的条件:
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
注意:
- 多态是方法的多态, 属性没有多态性、
- 父类与子类, 要有关系。否则类型转换异常: ClassCastException
- 存在条件: 继承关系,方法需要重写,父类的引用指向子类对象: Father f1 = new Son()
无法重写的方法:
- 1.static 方法, 属于类的,不属于实例
- 2.final 常量
- 3.private 私有方法
instanceof (作类型转换) - 引用类型
- instanceof 判断2个类是否是父(爷、祖)子关系。
class Person {
public void run() {
System.out.println("person run...");
}
}
class Student extends Person{
@Override
public void run() {
System.out.println("Student run...");
}
public void eat() {
System.out.println("Student eat...");
}
}
// 调用
public class Appliction {
public static void main(String[] args) {
// 一个对象的实际类型是确定的
// Student 能调用的方法有:自身的 和 继承父类的
Student s1 = new Student();
// 父类的引用指向子类
// Person 父类型,可以指向子类,但不能调用子类独有的方法。
Person s2 = new Student();
// 子类未重写前,调用 Person.run()
// 子类重写run方法后,都调用 子类的方法 Student.run()
s2.run();
// 对象能执行的方法,主要看对象左边的类型,和右边关系不大、
s2.eat(); // 此处报错了,只能强制类型装换成 子类才能调用此方法: 父(高)->子(低):强制转换:(Student s2).eat();
s1.eat();
}
}