关键字
this关键字
- 当前类对象的引用(地址)
- this构造方法的使用场景:
super关键字
- 代表父类存储空间的标识
- 如果被调用的成员变量|成员方法在子类中不存在,那么"super."可以省略,而且本质上省略的是"this.",因为子类已经继承了父类的成员变量和成员方法。
static关键字
-
静态,修饰符(变量、方法):
可以修饰成员变量,也可以修饰成员方法
被JVM调用,不创建对象就可以使用 -
成员修饰特点:
(1)可以被类的所有对象共享
(2)多了一种调用方式,可以通过类名调用(且静态成员建议使用类名调用)
(3)随着类的加载而加载,优先于类的对象存在。(类的字节码文件进入方法区时,静态成员就会在堆内存区的静态成员变量区中存储并分配默认初始值。) -
使用场景
(1)成员变量:需要共享数据时用static修饰
(2)成员方法:static修饰常用在工具类中
【工具类:存在的方法都是为别的类调用提供的,可以直接通过类名调用,不需要再new一个工具类的对象才能调用,因此如果一个类所有成员方法都是static的话,该类的构造方法会被设置成私有,从而强制通过类名调用,禁止new类对象浪费内存空间】 -
注意事项
(1)静态方法中,只能访问静态成员(直接访问)
(2)static中不允许使用this关键字
【非静态成员需要new出对象之后才会存在,this指代的也是类对象,而static成员随着类的加载就已经存在了,因此静态方法没办法访问非静态成员,也不能使用this关键字】 -
final关键字
-
最终,修饰(方法,类,变量)
-
fina修饰的特点
(1)修饰方法:表明该方法是最终方法,不能被重写
(2)修饰类:表明该类是最终类,不能被继承
(3)修饰变量:表明该变量是常量,不能再次被赋值 -
注意:
(1)基本数据类型:数据值不能改;引用数据类型:地址值不能改,内容可以改
(2)final修饰成员变量,不允许修饰默认值!(必须定义时赋值|构造方法中赋值)
(3)final修饰变量的命名规范:所有字母大写,单词之间以'_'分隔
权限修饰符
private
- 只能在同一个类中访问
(default)
- 可以在同一个类,同一个包中访问
protected
- 可以在同一个类,同一个包,不同包的子类中访问
不同包的子类中访问:如果子类和父类不在同一个包中,子类成员方法中可以调用父类protected的成员
public
- 可以在任意位置访问
构造方法
- 创建类对象时自动执行,可以执行一些初始化类的操作
- 不允许手动调用
- 如果没有定义有参数构造方法,系统会给出一个默认的无参数构造方法;如果定义了有参数构造方法,系统则不会给出默认的无参数构造方法
一般把系统默认生成的无参数构造方法和有参数构造方法都手动定义,这里属于方法重载
封装
-
使用类设计对象时,将需要处理的数据以及处理这些数据的方法,设计到对象中
-
优点:
1.便于维护数据,保护数据安全性
2.使用者不需要知道内部实现细节,只需要了解使用方法即可 -
设计规范
合理隐藏、合理暴露
标准JavaBean
- JavaBean是实体类。实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离
- 类成员变量全部私有,对外提供get和set方法
- 提供无参和带参的构造方法
包
继承
继承的介绍和使用
-
让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员
-
继承的格式
-
什么时候使用继承?
继承特点
- Java只支持单继承,不支持多继承,但是可以多层继承
继承中成员的访问特点
1. 成员变量
如果子类和父类中成员变量重名,通过this关键字调用本类(子类)成员变量,通过super关键字调用父类成员变量
2. 成员方法
方法重载(Overload)
- 同一个类中,方法名相同,参数不同(参数类型、参数个数、参数顺序),与返回值无关
方法重写(Override)
- 在子父类中,出现了方法声明完全相同的方法(方法名、参数、返回值)
继承的构造方法
抽象类
介绍
是一种特殊的父类,内部可以编写抽象方法
定义格式
注意事项
abstract关键字和其他关键字的冲突
接口
介绍
接口中的成员特点
JDK8接口新特性
-
应用场景:如果项目升级,接口需要增加方法,那么所有的实现类都会报错;
-
既然接口已经允许方法带有方法体了,索性直接放开静态方法,可以类名直接调用
JDK9接口新特性
类和接口之间的各种关系
抽象类和接口的对比
【接口为程序制定规则,使得代码更加规范】
多态
定义
- 同一个行为具有多个不同表现形式或形态的能力
多态的前提
多态的成员访问特点
多态调用静态成员时始终通过父类类名调用的父类静态成员
多态的好处
多态的弊端
多态中的转型
多态中转型可能出现的问题
解决:
代码块
匿名内部类
public class AnonymousClassTest {
/** 匿名内部类
格式:new 类/接口名(){
}
new 类名(){} : 代表继承这个类
new 接口名(){} : 代表实现这个接口
*/
public static void main(String[] args) {
/*
调用使用接口为参数的函数,不能直接传入接口
应用多态传入接口实现类对象 [在接口中抽象方法很多的情况下,建议还是传入接口实现类对象]
*/
useInter(new InterImpl());
/*
匿名内部类作为方法参数,更加简洁 [适用于接口中抽象方法不多的情况]
*/
useInter(new Inter() {
@Override
public void show() {
System.out.println("匿名内部类。。。show。。。");
}
});
}
/*
定义了一个参数为接口的函数
*/
public static void useInter(Inter i) {
i.show();
}
}
/*
定义一个接口
*/
interface Inter {
void show();
}
/*
定义接口实现类
*/
class InterImpl implements Inter {
@Override
public void show() {
System.out.println("接口实现类。。。show。。。");
}
}
Lambda表达式
Lambda介绍
!!并不是所有的匿名内部类都可以用Lambda表达式进行简化
!!Lambda表达式只能简化函数式接口的匿名内部类的写法