类和对象
1.概念
类是具有相同行为和状态的一组对象的模板,类一般用于描述某一群体,或者某一类事物的共性,例如:鸟类,人类或者建筑工人,艺术家等等。类是抽象的。类是对象的模板,对象是类的实例。
2.语法
[修饰符] class ClassName{}
3.类之间关系
-
依赖(uses-a)
-
聚合(has-a)
-
继承(is-a)
4.自定义类
-
语法:类是由属性(field)和方法(method)组成
class ClassName{ field; field; method(){} }
5.对象
类是对象的模板,对象是类的实例,类描述了一类事物或者群体,是抽象的,对象则是具体的,例如学生类是抽象的,但是学生张三则是具体的。
6.创建对象的方式
-
new运算符
//类名 对象名 = new 构造方法(参数列表) Hero h = new Hero();
-
反射
//第一种 Hero h = new Hero(); Class clazz = h.getClass(); //第二种 Class clazz = Hero.class; //第三种 Class.forName("cn.itlaobing.java.Hero")
-
clone
//类必须要实现CloneAble接口 Hero h = new Hero(); h.clone()
-
反序列化
//类必须实现序列化接口
7.变量
-
实例变量:定义在类内部,方法外部的变量
-
局部变量:方法参数,方法内部定义的变量,循环结构,分支结构,代码块内定义的变量
-
静态变量(类变量):定义在类内,用static修饰,有且只有一份
-
常量:使用fianl修饰的变量,值一旦确定就不能被修改
8.方法
-
定义:方法是完成特定功能的,可复用的独立代码片段。也可以叫做函数。
-
语法:
[修饰符] 返回值类型 方法名称(参数列表){}
-
分类
-
参数
-
有参方法
-
无参方法
-
-
返回值
-
有返回值(返回值类型要和方法头中返回值类型保持一致)
-
无返回值(方法头中返回值类型用void代替)
-
-
修饰符
-
实例方法
-
静态方法(static修饰)
-
-
作用:
-
构造方法
-
实例方法
-
-
-
方法调用:
实例方法 | 静态方法 |
---|---|
对象.方法名(参数列表) | 类名.方法名(参数列表) |
-
可变参数:本质是一个数组
-
作用域和生命周期:一个变量的作用域只被限制在当前变量所在的语句块中(也就包含该变量的,离该变量最近的大括号)。
成员变量 | 局部变量 |
---|---|
在类内任意位置都可以使用 | 只能在所在的方法内部使用 |
9.构造方法
创建对象时运行的方法,方法名和类名相同,构造方法没有返回值,也不用void修饰,为实例变量给定默认值
-
jvm默认提供一个无参构造方法
-
构造方法是在创建对象时由jvm调用
-
当提供构造方法以后,jvm不再提供默认构造方法。
10.this
-
访问当前对象成员变量和成员方法,this可省略
-
构造方法内区分成员变量和方法参数,this不可以省略
-
调用其他构造方法,调用其他构造方法是放在第一行,this不可省略
方法重载
-
方法名相同,参数列表不同
-
与返回值类型无关
-
与异常无关
-
与访问修饰符无关
11.继承
-
定义:在已存在类的基础上构造一个新类。继承已存在的类就是复用这些类的方法和field,在此基础上可以添加一些新的方法和域(field),以满足新的需求。其中被继承的类又叫父类,基类,或者超类,新构造的类称为子类,派生类,在java当中继承是单继承,即一个子类只能继承一个父类,但是每个类都会隐式继承Object,另外,构造方法不能被继承
-
语法
class A extends B{}
-
方法重写(两同两小一大)
-
方法名相同
-
方法签名相同(参数类型和顺序相同)
-
返回值类型等于父类方法返回值或者其子类
-
抛出异常小于等于父类抛出异常
-
访问修饰符大于等于父类访问修饰符
-
-
super
-
访问父类成员变量和成员方法,不可省略
-
访问父类构造方法,访问父类构造方法是通常放在第一行
-
-
构造方法执行顺序:先父类,再子类
-
Object类
方法 | 描述 |
---|---|
getClass() | 获得当前对象的类对象 |
hashCode() | 返回当前对象的hashCode() |
equals() | 判断两个对象是否相等 |
clone() | 克隆并返回当前对象副本 |
toString() | 打印该对象 |
notify() | 线程唤醒 |
notifyAll() | 线程唤醒 |
wait() | 线程等待 |
finalize() | 通知垃圾回收器回收,该方法不确实实际执行时间,不推荐使用 |
-
重写equals方法
-
自反性:对于任何非空引用a,a.equals(a),应该返回true
-
对称性:对于任何引用x和y,当且仅当x.equals(y)返回true,y.equals(x)也应该返回true
-
传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true。
-
一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果
-
对于任意非空引用x,x.equals(null),应该返回false。
-
-
重写equals方法步骤
-
检测this是否与obj对象为同一引用对象
-
检测obj对象是否为null,如果为null则返回false
-
比较this和obj是否属于同一个类。
-
将obj转换为相应的类型变量
-
对所有需要比较的域进行比较,基本类型使用==,引用类型使用equals
-
-
重写hashCode
-
equasl和hashCode必须一致,如果x.equals(y)返回true,那么x.hashCode()就必须和y.hashCode()具有相同的值
-
所有的成员变量都参与计算hashCode
-
-
重写toString()
12.封装
-
定义:将对象的信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过类提供的方法来实现对内部信息的操作和访问。
-
访问修饰符范围
修饰符 | 范围 |
---|---|
public | 公共的 |
protected | 同包,子类 |
default | 同包 |
private | 类内 |
修饰符/范围 | 类内 | 同包子类 | 同包非子类 | 非同包子类 | 非同包非子类 |
---|---|---|---|---|---|
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | × |
default | √ | √ | √ | × | × |
private | √ | × | × | × | × |
13.包
-
java文件的组织和管理,以及控制访问权限
-
包命名:域名倒置,在操作系统内以文件夹的形式展现
-
包的导入 1. import 2. java.util.Scanner 3. 静态导入
4. 常用包:java.util java.lang java.sql java.text,java.time
13.多态
-
java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型是由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。
-
表现形式
-
父类引用指向子类对象
-
10.工具类
-
Math
方法 | 作用 |
---|---|
Math.sqrt() | 求平方根 |
Math.pow(x,a) | 幂运算,x的a次方 |
Math.floorMod(x,y) | 求余,x%y |
Math.sin() | 求正弦 |
Math.cos() | 求余弦 |
Math.tan() | 求正切 |
-
LocalDate
方法 | 作用 |
---|---|
now() | 构造一个表示当前日期的对象 |
of(int year,int month,int day) | 构造一个给定日期对象 |
getYear() | 获取年份 |
getMonthValue() | 获取月份 |
getDayOfMonth() | 得到当前日期的年月日 |
getDayOfWeek() | 获取当前星期几 |
plusDays() | 获取当前日期之后的n天 |
minusDays() | 获取当前日期之前的n天 |
面试题:
1.请简述方法重写和方法重载的的区别
方法重写(override)
-
方法重写也叫方法覆盖,必须存在于继承关系中,子类方法必须和父类方法具有相同的方法名称和参数列表。
-
子类方法返回值可以是父类方法返回值子类
-
子类方法抛出异常小于父类方法抛出异常
-
子类不能重新父类private修饰的实例方法,因为private修饰的方法无法被子类继承
-
父类构造方法不能被子类重写
方法重载(overload)
-
同一个类中,具有两个或者两个以上的方法拥有相同的方法名称、但是具有不同的参数列表即为方法重载
-
方法重载与返回值无关,访问修饰符无关,参数名称无关,抛出异常无关
2.请简述super和this的用法
super
-
super主要用于对父类成员的调用,包括成员变量,成员方法,构造方法,this主要用于对本类内成员的调用
-
super在继承了父类的不同子类内构造函数中使用,this是在同一个子类中构造方法内使用。
-
this调用的是本类的成员变量或者方法,如果本类中没有被调用的成员变量或者方法,则从父类中查找,super访问的是父类的成员变量或者方法
-
this代表当前对象,super代表父类对象
相同点
-
this和super在构造函数中使用都必须放在第一行,因此this和super在同一构造方法内不能同时出现
-
this和super操作的都是实例成员,而不是静态成员
3.请简述面向对象特征
-
继承:在已存在类的基础上构造一个新类。继承已存在的类就是复用这些类的方法和field,在此基础上可以添加一些新的方法和域(field),以满足新的需求。其中被继承的类又叫父类,基类,或者超类,新构造的类称为子类,派生类,在java当中继承是单继承,即一个子类只能继承一个父类,但是每个类都会隐式继承Object,另外,构造方法不能被继承。
-
封装:将对象的信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过类提供的方法来实现对内部信息的操作和访问。封装一般通过访问修饰符实现。
-
public:类内,同包子类,同包非子类,非同包子类,非同包非子类
-
protected:类内,同包子类,同包非子类,非同包子类
-
default:类内,同包子类,同包非子类
-
private:类内
-
-
多态:java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型是由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。即相同对象调用相同方法展现的不同行为,此外,父类只能调用子类从父类继承或者重写的方法,父类不能调用子类新增的方法。
4.请简述类方法实例方法和构造方法的区别
-
构造方法负责对象初始化,为实例变量赋初始值,方法名和类名相同,没有返回值也不用void修饰,不能用static,final修饰不能被子类继承,但是可以被重载。
-
被static修饰的方法为类方法,也叫静态方法,通常只能被类方法调用,不推荐使用对象调用
-
实例方法一般由对象调用。