面向对象
-
对象:具体的某一个东西
-
类:某一类的统称,抽象的概念
-
对象依托于类的模板构建出来,类有一个模板
-
类里面有字段、方法
public class Student{ int age; String name; public void study() { System.out.println("学习"); } }
-
对象
Student student = new Student();
new出来的东西都在==堆内存==,student变量存在==栈内存== -
使用
student.name/student.study()
对象名.属性/ 对象名.方法名()
-
成员变量:类的属性,在整个类;局部变量:方法中定义的变量,所在方法体,或者离他外面最近的大括号内
-
构造方法,在创建对象的时候会调用,如果类的内部没有显式声明,会生成一个默认的无参构造
-
this
的作用:-
访问本类中的方法,此时谁调用就是谁
-
区分成员变量和局部变量
this.属性名
指代成员变量 -
使用
this
可以调用重载的构造方法,只能在构造方法的第一行使用
-
-
static
关键字: -
静态的意思,类变量,类方法;静态成员和实例成员的区别
-
static在加载类模板的时候初始化,实例成员在创建对象的时候初始化
-
static可直接通过类名访问属性和方法,实例成员只能通过对象名访问属性和方法
-
static不能访问实例成员,实例成员都可以访问
-
静态成员不能使用this关键字,实例成员可以使用
-
-
代码块:实例代码块
{}
和静态代码块static{}
-
对象初始化的顺序:
-
加载类
-
加载静态成员
-
执行静态代码块和赋值等操作
-
初始化实例成员
-
执行实例代码块和赋值等操作
-
执行构造方法
-
-
对象数组:数组中的每一个成员都是对象
-
包:
-
存放类,防止类的命名冲突,实际上就是一个文件夹
package com.kfm; // 声明包的含义是声明当前类所在的包。 import com.kfm.movie.Test; // 导入包的含义是声明当前类要使用到的其他类所在的包。
-
导包的情况
-
不在同一个包的情况或者使用全限定名
java.util.Scanner/java.util.Objects
-
java.lang包下的类不需要导包
-
同包或者子包不需要导包
-
-
-
三大特性:封装、继承、多态。
-
封装:
-
合理隐藏、合理暴露
-
访问修饰符:
-
三个4种
-
public : 任何地方可以访问
-
protected : 同包任意类,不同包子类可以访问
-
package-access:同包任意类
-
private : 只能本类访问
-
只有public和package-access可以修饰类
-
-
-
字段私有
-
对外提供getter/setter方法
-
getter : get + 字段名首字母大写
-
setter : set + 字段名首字母大写
-
boolean的get方法 :is + 字段名首字母大写
-
-
-
继承:
-
子类对父类的扩展
-
java类只支持单继承
-
所有类的父类都是Object
-
子类继承父类的非私有属性和方法
-
子类可以新增属性和方法
-
子类可以调用父类的构造,super关键字
-
重写(覆盖)和隐藏
-
在继承关系中,子类和父类存在方法名相同,参数列表相同,返回值类型一致,访问修饰符相同或变大,抛出异常相同或缩小的方法称为重写
-
在继承关系中,成员变量只能被隐藏,不能被重写
-
变量可以交叉隐藏,实例变量隐藏静态变量,静态变量隐藏实例变量
-
static方法不能被重写,只能被隐藏
-
static方法不能重写实例方法,实例方法也不能重写static方法
-
-
super关键字:
-
在子类中调用父类的构造方法,必须放在构造方法的第一行
-
调用父类的属性和方法
-
super不能表示当前对象
-
super只能出现在子类中,不能在static成员中使用
-
-
子类实例化过程【有父才有子,有父类对象才有子类对象】
-
加载父类,初始化父类的静态成员
-
执行静态代码块和赋值等操作
-
加载子类,初始化子类的静态成员
-
执行子类的静态代码块和赋值等操作
-
初始化父类的实例成员
-
执行父类的实例代码块和赋值
-
执行父类的构造
-
初始化子类的实例成员
-
执行子类的实力代码块和赋值
-
执行子类的构造
-
-
final关键字
-
修饰变量,称为常量,不可变,一旦被初始化无法被修改,在构造或者第一次声明的时候就初始化
-
修饰类,类不可被继承
-
修饰方法,方法不可被重写
-
-
Object类
-
toString:
-
equals:
-
getClass
-
hashCode:
-
-
Objects类:
-
equals:
-
toString:
-
nonNull
-
isNull
-
requireNonNull
-
-
this和super的区别:
-
this访问本类中的方法,包括继承父类的方法,super访问父类的方法
-
this(参数列表)调用本类的构造方法,必须放在构造方法的第一行
-
super(参数列表)表示调用父类的构造方法,必须方法在子类的构造方法的首行
-
this和super调用构造的时候不能同时出现
-
this.字段调用对象的字段,也包括继承父类的字段
-
super.字段调用父类中的字段
-
this和super方法只能在实例成员中使用,不能在静态成员中使用
-
this表示当前对象,super不能表示当前对象
-
-
-
多态:
-
一个特定类型的变量可以引用不同类型的对象,能够自动调用引用的对象的方法
-
调用谁的方法取决于=右边指向的对象是哪一个
-
方法重写是实现多态的基础
-
父类类型 变量名 = 子类对象
-
只能调用重写的父类的方法或者父类的方法
-
不能调用子类的新增的方法
-
-
向下转型
-
验证父类引用是否属于子类对象
instanceof
关键字【推荐】Pet pet = new Dog(); if (pet instanceod Dog) { Dog dog = (Dog)pet; } if (pet instanceod Dog dog) { // 这样就可以调用Dog类中新增的方法和字段.. }
-
getClass()
方法Pet pet = new Dog(); if (pet.getClass == this.getClass) { // 再进行强转 }
-
-
使用父类作为形参类型
-
参数的类型取决去父类的引用指向的是哪个子类对象
-
-
使用父类作为返回值类型
-
返回值的类型取决于父类的引用最终执行的是哪个子类对象
-
-
-