面对对象的编程 (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
成员。继承只发生在
protected
、public
和包级访问权限(不使用任何访问修饰符)的成员上。 -
在 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是私有方法,无法重写