面向对象
static关键字
概述:是静态修饰符,可以用来修饰成员变量,成员方法,代码块
补充:类有五个部分所组成,成员变量,成员方法,构造器,代码块,内部类
修饰成员变量:
1.类变量:被static修饰的成员变量,属于类,内存中只有一份,被类和类的对象所共享 访问格式:类名.类变量(推荐使用) • 对象.类变量 2.实例变量:没有被static修饰的成员变量,属于对象,每个对象中都又属于自己的一份实例变量 访问格式:对象.实例变量 3.应用场景:某个数据只有一份,并且需要被所有对象共享时,建议该数据定义为类变量
修饰成员方法:
1.类方法:被static修饰的成员方法,属于类 访问格式:类名.类方法(推荐使用) • 对象.类方法 实例方法:没有被static修饰的成员方法,属于对象 访问格式:对象.实例方法 应用场景:在工具类中会使用类方法 工具类:概述:将一些共性功能封装到某个类中,让程序员使用 组成:1.所有的方法必须是类方法——>调用方便,可以直接调用 类名.类方法进行使用 • 2.构造器私有——>节省内存
修饰代码块:
静态代码块: 格式:static{} 特点:随着类的加载而执行一次,优先于对象存在 作用:真实开发时用来给复杂的数据进行初始化赋值 实例代码块: 格式:{} 特点:随着对象的加载而加载,每创建一次对象就执行一次代码块,而且是在构造器之前执行 作用:真实开发时,将多个构造器中重复的代码抽取带实例代码块中
static访问特点:
静态成员只能访问静态成员
设计模式
概述:开发时解决问题的最优解,称为设计模式,Java二十多种常见的设计模式 单例设计模式: 1.解决什么问题?——>保证一个类只创建一个对象 2.编码步骤:(1)构造器私有 • (2)定义类变量记录该类的一个对象 • (3)定义类方法返回该类变量 分类: 饿汉式单例——>获取对象时,对象就已经创建好了。空间换时间 懒汉式单例——>获取对象时,才开始创建对象。时间换空间。
继承
概述:
让一个类和另一个类创建父子关系,子类 extends 父类
特点:
1.子类会继承父类所有的非私有成员,子类还可以根据自己的需求定义属于自己的成员
2.创建子类对象:是由子类和父类多个类共同创建出来的
好处:
可以抽取代码的共性,减少重复代码的编写,提高代码的复用性,提高开发效率
注意事项:
权限修饰符:
private:私有,只能在本类中调用
缺省:同一个包中的其他类可以调用
protected:任意包下的子孙类
public:公共
单继承:
Java继承只支持单继承,不支持多继承,但支持多层继承
所有的类都直接或者间接的继承了object(祖宗类)
方法重写:
概述:父类方法无法满足子类的需求时,子类可以重写一个和父类方法一模一样的方法,覆盖父类方法
注意事项:
1.重写方法上建议加上@Ovrride注解,检查重写格式是否正确
2.子类重写方法和父类方法证声明一致
使用场景:重写object类的toString方法
子类方法中访问其他成员的特点:
1.访问成员,遵循就近原则 先子类局部——>子类成员——>父类成员——>报错
2.在子类方法中直接访问父类成员,super.父类成员
super代表父类存储空间标识,理解父类对象引用
子类构造器特点:
先执行父类构造器,再执行子类自己的构造器
子类所有构造器第一行隐藏super(),调用父类对应的构造器
问题——>如果父类没有无参构造,子类会直接报错
解决:1.手动给父类提供一个无参构造器 2.使用super(传参)调用父类有参构造器
作用:super(传参),多一种给父类成员变量的赋值方式
this和super的区别:
this是访问本类的成员(成员变量,成员方法),本类构造方法
super是访问父类的成员(成员方法,成员变量),父类构造方法
多态
概述:对象在不同时刻展现的多种形态
前提:1.要有继承/实现关系 2.要有父类引用指向子类对象 3.要有方法重写
多态方式创建对象访问成员:
访问成员方法,编译看左,运行看右
访问成员变量时,编译看左,运行看左
好处和弊端:
好处:定义方法时,将方法形参定义为父类类型,可以接收所有子类对象,提高程序拓展性
弊端:不能调用子类特有的功能
解决:强制类型转换,子 = (子)父
问题:真实类型不匹配,报类型转换异常的错
解决:intanceof关键字,可以判断父类真实类型
final
概述:最终修饰符,可以用来修饰类,方法,变量
特点:
修饰类,类不能被继承 工具类建议使用final修饰
修饰方法,方法不能被重写 模板方法设计模式中的模板方法建议用final修饰
修饰变量,变量只能在定义时被赋值一次,引用数据类型指的是地址值不能改变 建议常量时使用
常量:
概述:被static final修饰的成员变量称为常量
作用:系统作为配置信息存储使用
特点:1.命名所有字母大写,多个单词之间用下划线连接
2.阅读性强,维护性强
3.常量编译后可以被宏替换,替换成字面量,节省内存
抽象类和抽象方法
概述:被abstract修饰的类(方法)成为抽象类(抽象方法)
抽象方法没有方法体
特点:1.抽象类中可以有非抽象方法,有抽象方法的类一定是抽象类
2.抽象类中可以有所有普通类的成员(普通类中有的,抽象类中也都有)
3.抽象类不能创建对象,一般作为一种特殊的父类使用
4.子类继承抽象类后,必须重写抽象类中所有的抽象方法
作用:制定规则
应用场景:模板方法设计模式
解决问题:解决多个方法中重复代码的问题
实现步骤:
1.定义抽象类
2.定义模板方法,将多个方法的重复代码抽取到该方法中,建议用final修饰
3.定义抽象方法,让子类重写该方法,完成具体的功能实现
4.在模板方法中调用抽象方法
接口
概述:被interface修饰的一种特殊结构,本质是一个Java类
特点:
1.成员变量默认被static final修饰,都是常量。成员方法默认被public abstract修饰,都是抽象方法。
3.实现类实现多个接口后,必须重写里面所有的抽象方法
作用:制定规则
好处:
1.弥补单继承的不足
2.面向接口编程,程序变得更加灵活,且拓展性更好
接口两个注意事项(了解)
接口jdk1.8之后可以定义三种方法,都有方法体:
默认方法default
私有方法private
静态方法static
接口和接口之间是多继承关系
内部类:
分类:
成员内部类,静态内部类,局部内部类
匿名内部类:
概述:是一种特殊的局部内部类,定义在局部范围(方法,代码块,构造器)
格式:
new 类/接口(){重写方法};
做了两件事:
1.定义一个该类/接口的子类/实现类
2.并立即创建出该子类/实现类的对象
作用:更为简单创建子类/实现类对象
常见应用场景:也可以将匿名内部类对象作为参数进行传递
枚举:
概述:是一种特殊的类
格式:使用enum关键字定义的一种结构,public enum 类名{}
特点:枚举类第一行只能枚举项,而且每个枚举项都是常量,都是枚举类的一个对象
应用场景:用来标识一组信息,然后作为参数进行传递
泛型:
概述:定义类,接口,方法,时,可以添加<类型变量>,接收一个数据类型,称为泛型类,泛型接口,泛型方法,统称泛型
作用:使用来行变量接收数据类型,编译期间限制操作数据类型,避免强制类型转换出现的问题
自定义泛型:
自定义泛型类:public class XXX <类型变量,....>
自定义泛型接口:public interface XXX <类型变量,....>
自定义泛型方法:public <类型变量,....> void aaa(){}
类型变量定义在修饰符和返回值类型中间
类型变量只能在方法中局部范围使用
通配符,上下限:
通配符:?,使用泛型时,接收任意数据类型
上限:?extends 类型,使用泛型时,接收该类和所有的子孙类
下限:?super 类型,使用泛型时,接收类和所有的父类
两个面试题:
泛型擦除机制:程序编译后,class中所有的泛型都会被擦除成Object类型,节省空间
不能接收基本数据类型:基本数据类型不是Java类和object没有任何关系,无法相互转换