1.前一天重点内容复习
抽象类和接口的区别
成员的区别
接口
成员变量:
只能是常量,存在默认修饰符public static final,但是可省略
成员方法
抽象方法:让子实现类实现这个方法,存在默认修饰符public abstract
默认方法:必须有方法体
静态方法:必须有方法体
构造方法:
没有
抽象类
成员变量:
可以是变量,也可以是final修饰的变量(自定义常量)
成员方法:
可以是抽象方法,也可以是非抽象方法,抽象方法中必须携带abstract
构造方法:
存在
可以是无参构造方法,也可以是有参构造方法
因为存在继承关系,所以是分层初始化的
关系的区别
类与类的关系:
继承关系 extends
只支持单继承,不支持多继承,但是可以多层继承
接口和类的关系:
实现关系 implements
在一个类继承另一个类的同时可以实现多个接口
接口和接口的关系:
继承关系 extends
可以单继承,可以多继承,也可以多层继承
对象方法来源的区别:
抽象类让某个对象具有某个方法是因为这个对象本身应该具有,不以人为意志转移
接口让某个对象具有某个方法是设计者想让对象具有,受人为意志的影响
形式参数如果是一个具体的类,实际参数如何传递
实际参数可以是当前类对象,用变量引用对象或者匿名对象均可以
abstract不能和那些关键字冲突
private:将方法私有,外部类中无法重写、实现方法,但是abstract修饰的方法必须在外部类实现、重写
static:此关键字修饰用类名访问的方法,abstract修饰用对象名访问的方法
final:被final修饰的方法不能被重写,但是abstract修饰的方法需要让子类重写此关键字修饰的方法
抽象方法格式
public abstract 返回值类型 方法名(参数列表);
方法重写(override)和方法重载(overload)的区别
方法重写:
子类出现了和父类一模一样的方法声明,权限修饰符、返回值类型、参数列表以及方法名都相同,子类会把父类中相同的方法覆盖掉,变为自己的功能
方法重载:
定义方法时,方法名相同,参数列表(参数类型,参数数量,参数顺序)不同,与返回值无关,提高了扩展性
2.方法形式参数问题
方法中的形式参数无非就是传递数据,但是分为两种类型,一种是基本数据类型,一种是引用数据类型
如果形式参数为基本数据类型,实际参数即为当前对应的数据值,而且形参的改变不会影响实际参数
如果形式参数是引用数据类型,则不是值的传递,而是对象的空间地址传递,形参的改变会影响实际参数
形式参数如果是引用数据类型中的具体类,实参给的是此具体类的对象,使用变量引用或者匿名对象均可以,只要参数是此具体类的对象的空间地址值就可以
形式参数如果是引用数据类型中的数组,则实际参数需要传递的是一个数组对象
形式参数如果是引用数据类型中的抽象类,则实际参数需要传递的是抽象类子实现类的一个具体对象的地址值,使用变量引用传递或者直接匿名对象直接传递都可以
形式参数如果是引用数据类型的接口,则实际参数需要传递的是实现接口功能的子实现类对象地址值,同样可以使用变量引用传参,也可以使用匿名对象传参
3.方法返回值问题
方法返回值的数据类型只有两种,基本数据类型和引用数据类型
方法返回值类型如果是基本数据类型,使用对应类型的变量接受即可
方法返回值如果是引用数据类型中的具体类,则返回值为一个具体类的对象
方法返回值如果是引用数据类型中的抽象类,返回值为抽象类子实现类的一个具体对象
方法返回值如果是引用数据类型中的接口,返回值为实现这个接口的子实现类的对象
4.内部类
定义:一个类A中定义了一个类B,将类B称为类A的内部类,类A称为类B的外部类
分类:
成员内部类:定义在外部类的成员位置
局部内部类:定义在外部类的成员方法中
特点:
成员内部类及局部内部类可以访问外部类一切成员
外部类调用成员内部类中的方法
间接访问:可以通过创建内部类对象来访问内部类中的方法,之后将整个访问代码放入外部类的一个方法中,最后通过main方法创建外部类对象来调用包含内部类访问方法的方法来实现对内部类方法的访问
直接访问:
使用条件:成员内部类非私有,非静态
思想:将外部类及其中的内部类当成一个类,来创建对象访问方法
格式:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
5.私有内部类的访问方式
私有内部类相当于外部类的一个成员私有,所以想访问这个私有内部类只能通过外部类提供的访问方法来访问,外部类在这个方法中加入一些条件来限制访问内部类范围,并不是谁都可以访问的,保证了数据的安全性
6.静态内部类的访问方式
1.如果内部类是静态的,则内部类中的方法只能访问外部类中的静态成员
2.外部类想访问静态内部类中的成员,思想是将静态内部类作为外部类的静态成员,静态成员通过类名来调用即可,不需要new
3.外部类想访问静态内部类中的非静态成员,格式为:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
4.外部类想访问静态内部类中的静态成员,格式为:
外部类名.内部类名.静态成员;
7.静态内部类和静态方法的关系
静态内部类中可以没有静态方法,但是有静态方法的内部类必须是静态内部类,因为静态相关的先进内存方法区,之后才加载外部类,不可能存在开始加载类了,还有静态方法没有进内存中方法区的情况
8.局部内部类中的局部变量为什么要用final修饰
因为如果不用final修饰,则方法结束之后变量就消失了,但是内部类对象不会立即消失,还在使用局部内部类中的局部变量,所以为了让局部变量一值存在,直到内部类对象被GC(垃圾回收器)回收前可以访问到内部类中的局部变量,所以使用final修饰,使其常驻内存,变为常量
9.权限修饰符范围
private:和被修饰的成员在同一个类中,均可访问
默认修饰符:和被修饰的成员在同一个包中,均可访问
protected:和被修饰的成员在不同包下,但是有子类关系,均可访问
public:和被修饰的成员在不同包,均可访问
10.其他修饰符
static 结合自定义去使用
定义自定义常量结合final
格式:public static final 数据类型 变量名 = 初始化数据;
在工具类中将构造方法私有化,前面加入static,类名访问
abstract 修饰抽象类
在抽象类成员方法中定义抽象方法
public abstract 返回值类型 方法名(参数列表);
在接口中定义抽象方法
abstract可以省略
final结合static一块使用的
格式:public static final 数据类型 变量名 = 初始化数据;
11.包
实质:就是文件夹
作用:实际开发中,java文件非常多,不可能都放到同一个包下,所以得对代码进行分层管理,因此需要包,一般使用多级包进行管理
命名规则:一般使用公司域名反写
代码分包在实际开发中的案例
以com.qf.pojo/entity/domain为例
com.qf.pojo/entity/domain属于实体类层,里面存储的有:
实体类,这个类符合JavaBean规范,是一个具体类,属性私有化,对外提供公共的访问方法,实现了序列化接口,在网络中以流数据的方式传递
com.qf.service,属于业务接口层,也叫做service(服务)层,里面存储有:
业务接口,表明接口功能
com.qf.service.impl,里面存储有:
业务接口的实现,实现接口功能,数据来源是通过业务实现层调用数据访问层中的接口方法
dao:data access Object(数据访问对象)
com.qf.dao,为持久层,也称数据访问层,里面有
数据访问接口,功能为查询数据库信息
com.qf.dao.impl,里面是
数据访问接口的实现
com.qf.controller,属于控制层,里面有
调用业务层数据的方法
12.带包编译和运行
手动方式:
1.先创建文件夹,之后将编译的class文件放进去
2.java 包名.class文件前缀名
自动方式:
1.Javac -d .java文件,会自动创建包并且将class文件放入包中
2.只需带包编译即可,java 包名.class文件前缀名
13.Object类中的getClass方法
作用:获取当前正在运行的Class类对象
内容:class 包名.字节码文件名
14.获取一个类的字节码文件方式
第一种:
使用Object类中的getClass()方法
第二种:
任意java类型的class属性可以获取
15.如何获取类的全限定名称
Class的对象调用getName()方法即可获得全限定名称(包名.类名)
16.Object类中的hashCode方法
作用:返回经过哈希算法计算的一个值,称为哈希码值
17.Object类中的toString()方法
所有类都继承自Object类中,建议所有继承类中重写toString()方法
Object类中toString()方法的原码:
返回值是一个String类型,返回值实质为当前类对象的全限定名称@对象的哈希码值的十六进制数据,表现为包名.类名+@+十六进制数据
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
可以自己重写toString()方法,使其输出我们自己想要的格式
也可以自动生成,使用idea提供的toString()方法,使用alt+ins键,选择toString()方法
18.Integer类中的toHexString(对象.HashCode())
功能:将对象的哈希码值算出来,转换为一个十六进制数据
19.Object类中的equals()方法
作用:比较对象的地址值是否相等
原码:
public boolean equals(Object obj){
return (this==obj);
}
equals方法和==的区别
==: 连接的两个是基本数据类型,则比较数据值是否相等,如果是引用数据类型,则比较地址值是否相同
equals方法: 比较两个引用类型的地址值是否相同
建议所有子类重写此方法,并且重写hashCode方法,将此方法比较的从两个对象的地址值变为两个对象中的内容,hashCode()方法比较两个对象的哈希码值,从比较地址值是否相等转换为比较内容是否相等
自动生成:alt+ins键选择equals and hashCode