一、static
静态,修饰成员变量、成员方法
1.修饰成员变量
因为类变量被类的全部对象共享,所以可用类名.类变量来访问,而实例变量只能用对象.实例变量来访问。
2.类变量的应用场景
如果某个数据只需要一份,且希望能够被共享(访问,修改),则该数据可以定义成类变量
例如:
系统启动后,要求用户类可以记住自己创建了多少个用户对象
3.修饰成员方法
4.类方法的应用场景
最常见的应用场景就是做工具类
作用:
提高了代码复用;调用方便,提高了开发效率。
5.static注意事项
this是拿到对象,而类方法不用创建对象就可以调用,所以类方法不能出现this
二、代码块-类的5大成分
成员变量-构造器-方法-代码块-内部类
如果不同的构造器中有相同内容,实例代码块可以减少冗余。
三、单例设计模式
1.设计模式
- 一个问题有n个解法,其中有一种解法是最优的,这个最优的被人总结出来了,称之为设计模式。
- 设计模式有20多种,对于20多种软件开发中会遇到的问题。
只需要知道两点:1解决什么问题,2怎么写设计模式
2.单例设计模式
特点:确保一个类只有一个对象
写法:
- 把类的构造器私有
- 定义一个类变量记住类的一个对象
- 定义一个类方法,返回对象
饿汉式单例书写模式: (获取类的对象就已经创建了对象)
应用场景:例如任务管理器,只需要一个,就可以完成任务,避免浪费内存
懒汉式单例设计模式:(拿到对象时,才开始创建对象)--很少用的时候再调用
写法:
- 把类的构造器私有
- 定义一个类变量用于存储对象
- 定义一个类方法,保证第一次调用时创建一个对象,后面再调用会返回同一个对象
四、继承
1.认识继承
Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系
继承的特点:
--子类能继承父类的非私有成员(成员变量、成员方法)。--可以直接使用
继承后对象的创建:
--子类的对象是由子类、父类共同完成的。
子类对象是由父类公有成员模板和子类成员模板共同构成的。
2.继承的好处
减少重复代码的编写,子类有共同特征
3.权限修饰符
4.单继承,Object类
--Java是单继承的,Java的类不支持多继承,但是支持多层继承
--创建一个类,没继承别的类也会默认继承一个Object类
5.方法重写
①认识重写:
--当子类认为父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法
注意:重写后,方法的访问遵循就近原则
声明不变,重新实现
重载:重载是指在相同的作用域内使用相同的函数或操作符名称,但是参数的数量或类型(或二者)不同。这允许同一个函数名根据传入参数的不同而执行不同的任务
②常用场景
--子类重写Object类的toString()方法,以便返回对象的内容。·
6.子类访问其他成员的特点
无指定的时候遵循: 就近原则
如果父类、子类以及方法中都有相同的成员变量
想要访问子类中的成员:使用this
想要访问父类中的成员:使用super
7.子类构造器的特点
①认识子类构造器:
子类的全部构造器,都会先调用父类的构造器,再执行自己的构造器
代码上体现时,在执行子类的构造器时会默认有一条super()去调用父类的无参构造器
如果父类只有有参构造器,那么在子类构造器内得手动写一条super(父类构造器参数)
②常见场景:
父类的有参构造器为它的成员变量赋值,子类中想要方便去给父类成员赋值可以在子类构造器中加上super(父类构造器参数)。
③补充知识:this()调用兄弟构造器
--任意类的构造器中,是可以通过this(...)去调用该类的其他构造器的。
好处:可以复用兄弟构造器的代码
五、多态
1.认识多态
多态是在继承/实现情况下的一种现象,表现为:对象多态,行为多态。
对象多态理解:同一个人既会是父母的儿子,也会是男朋友,也会是公司职员
行为多态理解:同一个唱歌行为,有的对象唱的很好听,但是有的对象唱的不堪入耳
代码体现:Student和Teacher都是People的子类,且两个子类各自重写了父类run方法
对于方法,它是编译时看父类是否有此方法,但运行时看子类中的此方法
对于变量,它是编译和运行都看父类中的变量
多态的前提:有继承/实现的关系;存在父类引用子类对象;存在方法重写
2.多态的好处
- 在多态形式下,右边对象是解耦合的,更便于扩展和维护
- 定义方法时,使用父类型的形参,可以接受一切子类对象,扩展性更强,更便利
对于第一条,体现时等号右边可以随时更换不同的子类,实现不同的业务
对于第二条,形参使用父类,则实参可以用一切子类
缺点:
多态下不能使用子类的独有功能--因为方法,编译看父类,父类中没有这个独有功能
3.类型转换:
因为存在强转可能出现类型转换异常,所以推荐使用p instanceof Student,判断是否是其子类
六、final
认识final关键字
final关键字是最终的意思,可以修饰(类、方法、变量)
例如:
工具类加final不让继承
常量:staic final修饰的成员变量,建议名称全部大写,多个单词下划线连接
七、抽象类
1.认识抽象类
--在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法
修饰类,就是抽象类;修饰方法,就是抽象方法
抽象方法:只有方法签名,一定不能有方法体
2.抽象类的好处
父类知道每个子类都要做某个行为,但每个子类的情况不一样,父类就定义成抽象方法,哪个行为的方法定义为抽象方法,交给子类去重写实现,设计抽象类是为了更好地支持多态。
3.常见应用场景-模板方法设计模式
模板方法设计模式解决的问题:
如果某个方法有一部分子类是一样的,那么在父类中可以定义为抽象类,设置两个方法,模板方法中写相同的内容,不同的地方调用抽象方法,子类去重写那个抽象方法来体行为多态,并且减少冗余。
所以建议模板方法建议加final关键字,避免子类去重写。
八、接口
1.认识接口
Java提供了一个关键字interface,用这个关键字可以定义一个特殊的结构:接口
默认成员变量为常量,成员方法为抽象方法
注意:
- 接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类被称为实现类。
- 一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。
2.接口的好处-重点
- 弥补了类单继承的不足,一个类同时可以实现多个接口。
- 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。
对于第一条:单继承无法扩展其他特征,接口可以扩展其他功能,使用接口实现,可以告诉别人你有这个相应的功能
对于第二条:可以随时切换不同的对象,实现不同业务切换
3.接口的案例
若对班级的操作有两套打印方式,可以随时切换
首先定义Student类,包含Student所有信息
其次定义ClassManager,实现对班级人员录入,以及实现方法的操作平台
然后定义一个接口,包含了班级操作平台中的要实现切换的方法
最后定义两个不同的操作类,都实现这个接口,编辑不同的操作方式
在ClassManager中只需要对studentOperator后new的操作方式修改就可以实现对不同方法的切换
4.细节:新增的三种方法
我的理解:可以拓展很多功能,便于维护,default必须有实现类,创建类才能调用;private是为其他两个方法服务,让代码更清晰;static必须用接口名来调用。
5.细节:接口的多继承
一个接口可以继承多个接口
注意:
- 一个接口继承多个接口,若多个接口存在方法签名存在冲突,则不支持多继承
- 一个类实现多个接口,若多个接口存在方法签名存在冲突,则不支持多实现
- 一个类继承了父类,又同时实现了接口,若父类中和接口中有同名的默认方法,实现类会优先使用父类的
- 一个类实现多个接口,若多个接口存在签名相同的默认方法,可以不冲突,重写方法即可
九、内部类
是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
1.成员内部类
就是类中的一个普通成员,类似前面的普通成员变量,成员方法。
注意:
- 主程序中创建对象格式:外部类名.内部类名 对象名=new 外部类(...).new内部类(..)
- 像成员方法一样可以使用外部类中实例成员和静态成员
- 在内部类中想要使用外部类中的变量,可以使用外部类名.this.变量名
2.静态内部类
用static修饰的内部类,属于外部类自己持有,
注意:
- 主程序中创建对象格式:外部类名.内部类名 对象名=new 外部类.内部类(..)
- 可以比作之前按静态方法一样,只能访问外部类的静态类
3.局部内部类-鸡肋
局部内部类是定义在在方法中、代码块中、构造器等执行体中。
3.匿名内部类-重点
①认识匿名内部类
就是一种特殊的局部内部类;所谓匿名:就是程序员不需要为这个类声明名字。
特点:创建匿名内部类后,会编译一个子类,然后会立即创建一个子类对象出来。同时是一个子类也是一个子类对象。
作用:用于更方便地创建一个子类对象
②匿名内部类的使用场景
通常作为一个参数传输给方法
真实应用场景:使用接口或类中的方法时它的形参为一个类,就可以使用匿名内部类来实现。我们不主动编写匿名内部类,只在必须使用这种方法时使用来简化代码。
十、枚举
1.认识枚举
是一种特殊的类
注意:
- 第一行必须罗列的时枚举对象的名字,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
- 枚举类的构造器是私有的,因此,枚举类对外不能创建对象。
- 枚举类都是最终类,不可以被继承
- 枚举类中,从第二行开始,可以定义类中的其他各种成员
- 枚举类提供一些额外的API
2.抽象枚举
就是在枚举中定义了抽象方法,而在抽象枚举中罗列对象的名字时,会创建抽象枚举,所以要对其中的抽象方法重写
3.单例
可以使用枚举构建单例设计模式-由于构造器是私有的,对外不能构造对象
这样在外就只有X这一个C类的对象。
4.应用场景
用来表示一组信息,然后作为参数进行传输-信息标志和分类
对于第一钟,会创建一个Constant类,来储存各种常量
对于第二种,会创建一个枚举,来限制
十一、泛型
1.认识泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类、泛型接口,泛型方法、它们统称为泛型。
加了<E>后就只能使用E类型参数
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力。这样可以避免强制类型转换,及其可能出现的异常
泛型的本质:把具体的数据类型作为参数传给类型变量。
2.泛型类
在类中写方法时: 可以定义多个变量
限定变量为继承指定父类的任意子类:
3.泛型接口
类实现泛型接口,就可以针对不同的类类型去重写方法
4.泛型方法
自己声明了泛型类型变量
5.通配符?
使用泛型的时候可以代表一切类型
加上extends接收的是Car和Car的一切子类的集合
若加上super接收的是Car和Car的一切父类的集合
6.泛型注意事项
编译的时候会把<>去掉,把类型进行强转
泛型不支持基本数据类型,只支持引用类型
--若想用int可以使用Interger
--若想用doublie可以使用Double