Java面向对象
- 对象,是具体的事物,类,是对对象的抽象
- 方法的回顾及加深:
(1) 修饰符 返回值 方法名(参数类型 参数名){方法体;return 返回值;}
(2) Break可以跳出switch,结束循环;return;可以结束方法
(3) 调用方法:a.静态方法:类名.方法名();b.非静态方法:对象.方法名()
(4) 静态方法无法调用非静态方法,因为静态方法是和类一起加载的,依附于类;而非静态方法是实例化后,即有对象产生后才存在,依附于对象
- 以类的方式组织代码,以对象的方式封装数据
- 类里只有两个东西,一个是属性,一个是方法,并且方法是用来改变属性的
- IDEA中,在想输出的东西后面加上.sout即可快速写出System.out.println(...);
- 构造方法:
(1) 和类名相同,不需要写返回值
(2) 又名构造器,即使不写构造器,也会存在一个默认的构造器,但是如果写了一个构造器,之前默认的构造器会消失,为了子类考虑,任何父类必须有无参构造,也就是说一定要写
(3) 创造对象必须用new,本质上就是在调用一个构造器
(4) 构造器是用来初始化属性的
(5) IDEA中,alt+insert,再选择constructor可以快速创建各种构造器
- 栈中存放方法和引用变量名,堆中存放具体对象和方法区(各种类(包含非静态方法)和静态方法)
- 引用类型:对象是通过引用来操作的,即用栈中的引用变量名操作堆中的具体数据
- 默认初始化:
(1) 数字:0,0.0
(2) Char:u0000
(3) Boolean:false
(4) 引用:null
- 封装:
(1) 封装是对于属性而言的
(2) 属性私有,修饰词private
(3) 操作属性用public的get/set方法(用第四步方法创建)
(4) IDEA中,alt+insert,再选择getter and setter可以快速创建get/set方法
- 继承:
(0) 当一个类没有声明构造方法时,Java提供默认构造方法,调用super()执行父类无参构造方法。但是,当父类有自己的构造方法时,Java不再提供父类的无参构造方法,子类也就没有默认构造方法了,因此,一个类通常需要声明无参构造方法,即使自己不用,也要为子类准备着
(0.5) 若子类构造方法中没有调用super()或者this(),Java默认执行super()。也就是,在子类构造方法中,若无特殊需求,则只需给子类专有变量赋值即可
(1) 子类继承父类,extends意思是扩展:public class Student extends Person{}
(2) 修饰符是final的类无法被继承
(3) 子类可以继承父类的public的属性和方法,私有的(private)无法被继承
(4) IDEA中,ctrl + h可以打开类的继承树结构界面
(5) 所有的类都直接或者间接继承object类
(6) Java中类只有单继承,没有多继承,即只有一个父类
(7) 子类构造器假如没有super(...),那么第一句默认执行父类无参构造器(如果父类没有无参构造器则报错),假如写super(...),也要放在第一句,其中...是父类有参构造器的实参,也可以没有,那就和默认的一样,可以省略
① 不能在子类构造器中既写this(),又写super(),因为this中就有super,如果都写了,那就是两个super!
② Super既可以出现在子类的构造器中,也可以出现在子类的其他方法中
③ Super()可以理解为父类构造器,super可以理解为父类对象的引用,this是当前对象的引用
(8) 重写都是方法的重写(就是子类重写父类方法,代码表现为方法名相同,参数列表也相同。static静态方法即使方法名相同,也不是重写,重写只针对非静态方法,继承过来然后覆盖,而static无法继承,也就无法覆盖重写),和属性无关(假设A继承了B)
① 父类引用B b可以指向子类对象new A(),假如是static静态方法,方法调用只和左边定义类型有关,假如是非静态方法,子类重写了父类方法,b调用方法先去子类里找
② 假如方法是private,final,state修饰的,那么都不能重写
③ IDEA中,alt+insert,再选择override method可以在子类中快速创建重写方法
④ 修饰符:范围可以扩大但不能缩小:public>protected>default>private
⑤ 抛出的异常:范围可以缩小但不能扩大
⑥ 原因:父类方法无法满足子类需求
- 子类重定义父类成员,虽然覆盖或者重载,实际上只是隐藏了同名的成员,父类同名成员依旧存在,在子类的实例成员方法中,可用super.……访问父类隐藏的成员
-
Super.成员变量 Super.成员方法(参数列表) (Super将当前对象作为其父类的一个实例引用)
-
覆盖方法:究竟执行覆盖方法中的哪一个,取决于调用该方法的对象所属的类是父类还是子类
- 当创建一个类的实例时,也隐含地创建了其父类的一个实例,因此,子类构造方法必须调用其父类的一个构造方法
- 多态:
(1) 是方法的多态,与属性无关
(2) 一个对象的实际类型是确定的,但是指向他的引用可以有很多(比如父类引用指向子类对象)
(3) 对象能执行哪些方法,主要看左边定义类型(父类引用指向子类对象)
① 子类型:能调用的方法都是自己的或者继承过来的
② 父类型:能调用的方法都是父类的,假如子类重写,那就调用重写的,不能调用子类独有的方法
(4) 子类转化为父类(例如A a = new A();B b = a),可能会丢失自己本来的一些方法
- a Instanceof B是判断a对象是否是B类或者B类子类的实例,是则返回true
- 假如B b = new A();那么就可以强制装换A a = (A)b;
- Static
(1) 静态属性属于类,各个实例可以共享
(2) 每个方法都可以调用静态和非静态方法,但是静态方法不能调用非静态方法(因为静态方法和类一起加载,此时非静态方法还未出世,如何调用)
- 抽象类
(1) Abstract修饰类就是抽象类,修饰方法就是抽象方法
(2) 抽象类不能被new,只是对子类的约束,但是有构造方法,是给子类用的
(3) 抽象方法只有定义,没有实现,是为了约束子类,假如子类不是抽象类就要实现所有抽象方法,否则子类也要定义为抽象类
(4) 有抽象方法的必须声明为抽象类,抽象类里也可以有普通方法
(5) 作用:约束子类
(6) 局限:Java的类是单继承,所以没有接口的多继承好用
- 接口
(1) 类是单继承,接口是多继承
(2) 关键字interface,类继承接口用Z implements A,B,C...
(3) 比较
① 普通类:只有具体实现
② 抽象类:具体实现+规范(抽象方法)
③ 接口:只有规范(约束和实现分离的一种机制)
(4) 接口里的方法不需要也不能有实现,表现为不能有{}
(5) 方法默认修饰符public abstract,可以省略,所以可以简写为:返回值 方法名(参数列表);常量默认修饰符public static final,可以简写为:数据类型 变量名 = 值(常量虽然可以定义,但很少使用)
(6) 类继承了接口,就要实现接口中的方法
(7) IDEA中,alt+insert,再选择implement method可以在继承接口的类中快速创建接口里的方法
(8) 接口没有构造方法
- 内部类:就是在一个类的内部再定义一个类,具体以后再聊