JavaSE基础-10.面向对象

Lin

Lin

xiaominglin789

面向对象

  • 本质: 以类的方式组织代码, 以对象的组织(封装)数据、

  • 抽象-提取成

  • 3大特征:

    • 封装 (高内聚,低耦合)
      • 高内聚: 类的内部数据操作细节自己完成。
      • 低耦合: 仅暴露少量的方法给外部使用。
    • 继承
      • 本质: 对某一批类的抽象。
      • 子类 extends 父类
      • 子类是父类的拓展。
    • 多态
      • 动态编译
  • 类与对象
    • 类: 抽象,模板
    • 对象: 一个具体的实例
  • 方法
    • 定义、调用
  • 对应的引用
    • 引用类型 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();
}
}