面对对象的编程 (OOP:Object-oriented programming)

属性 + 方法 = 类

以类的方式组织代码,以对象封装数据

  • 封装
  • 继承
  • 多态

类是对象的模板

同一包内class文件内容可以相互调用,而不用import

一个文件内可以有多个class类,但只有有一个public类

创建对象

一个程序只有一个主启动(main方法),可以改名启动类

类实例化后会返回一个自己类的具体实例

Student xiaoming = new Student();

new方法的本质是在调用构造方法

构造器

构造方法(函数)

  • 即使不写也会自动生成无参构造

  • 一旦定义了有参构造,无参构造就必须显示定义

  • 构造函数名与类名相同

  • 有参构造和无参构造 重载

alt + insert 默认生成有参构造器

  • 出现窗口后点击Constructer

  • 第一个选项即是当前的有参构造器

  • 最下部的第二个选线Select None是生成无参构造器

封装

封装大多数是针对属性

private 不能直接操作私有变量

要提供public的get、set方法间接操作

art + insert 自动生成 get和set 方法

使用set时可以进行一些合法性的检查

  • 提高程序安全性,保护数据
  • 隐藏代码实现细节
  • 统一结构
  • 提高系统可维护性

继承

public class 类名 extends 父类{}

继承:extends:扩展

  • public:子类继承父类就会有父类的全部public方法

  • private方法:子类不能继承

  • 在Java中所有的类都直接或间接的继承object类

  • Java 中只有单继承,没有多继承,最多只有一个父类

ctr + H 可看到继承关系

super	父类:只有在继承条件下才能使用
this	自身

当子类属性和父类属性或方法 名相同,可用super和this区分使用

子类调用构造方法时会隐形调用父类的构造器(super();父类构造器必须在子类构造器的第一行)

super();	//调用父类的构造器
this();	//调用本

注:

  • private 成员对子类不可见,子类无法直接继承或使用父类的 private 成员。

    子类可以通过父类提供的公共或受保护的方法,间接访问或操作父类的 private 成员。

    继承只发生在 protectedpublic 和包级访问权限(不使用任何访问修饰符)的成员上。

  • 在 Java 中,当你将数组作为参数传递给构造函数时,必须使用 new 关键字来显式地创建数组。这是因为 Java 的语法不允许直接传递类似 {1, 2, 3} 这样的数组初始化表达式

    简化的数组初始化语法仅在数组声明并初始化时可用。

  • 子类可以像父类一样只定义有参构造函数而没有无参构造函数。但是,当父类没有无参构造函数时,子类的构造函数必须显式调用父类的有参构造函数,否则编译会报错。


重写

重写都是方法的重写,与属性无关,只与非静态的public方法有关

父类的引用可以指向子类,但不能调用子类独有的方法

因为子类是父类的扩展,父类有的子类有,子类有的父类不一定有

静态方法和非静态的方法区别很大

静态方法:方法的调用只与定义的左侧有关

非静态的方法:子类重写(更改)了父类的方法,执行子类的方法

  • 方法名相同
  • 参数列表相同
  • 修饰符:范围可以扩大,private可以变为public,但是public不能变成protected
  • 抛出的异常:可以被缩小,但是不能扩大

重写:子类的方法必须和父类一致,但是方法体不同

重写的原因

  • 父类的功能,子类不需要
    @Override	//不写没错,但是建议写,其标签作用
    public void test(int ... i) {
    
    }

一个对象的实际类型是确定的

父类的引用可以指向子类的类型

Student s1 = new Student();
Person s2 = new Student();

多态

  • 多态是方法的多态,不是属性的多态
  • 父类和子类之间才有多态 ClassCastException;
    • static和final无法重写
    • private是私有方法,无法重写