目录
1、static
1.1 static修饰成员变量
被static修饰的成员变量是
静态变量
特点:
-
被该类所有对象共享
-
不属于对象,属于类
-
随着类的加载而加载,优于对象存在
调用方式:
-
类名调用(推荐)
-
对象名调用
static内存图:
注:静态区的数据是
共享的
1.2 static修饰成员方法
被static修饰的成员方法,叫做静态方法
特点:
-
多用在测试类和工具类中
-
JavaBean类很少使用
调用方式:
-
类名调用(推荐)
-
对象名调用
工具类:
要求:
-
类名见名知意
-
私有化构造方法
-
方法定义为静态的
1.3 static注意事项:
-
静态方法只能访问静态变量(类变量)和静态方法(类方法),不能调用非静态的成员变量(实例变量)和非静态的成员方法(实例方法)
-
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态方法
2、继承
2.1 继承简述
Java中提供了一个关键字
extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
如:
public class Student extends Person{}
Student称为
子类(派生类),Person称为
父类(基类或超类)
使用继承的好处:
-
可以把多个子类重复的代码提取到父类中,提高了代码的复用性
-
子类可以在父类的基础上,增加其他的功能,使子类更强大
什么时候用继承:
当类与类之间,存在相同的内容,并且满足子类是父类中的一种,可以考虑使用继承优化代码
继承后子类的特点:
-
子类可以得到父类的属性和行为,子类可以使用
-
子类可以在父类的基础上新增其他的功能,子类更强大
2.2 继承的特点
-
java只支持单继承,不支持多继承(一个子类只能有一个父类),但支持多层继承(子类A可继承B,B可继承C)
-
每一个类都直接或间接的继承 Object类
2.3 子类继承父类的哪些内容
虚方法表(提高调用成员方法的效率):
2.4 继承中成员变量的访问特点
就近原则:
-
无this或super修饰,先找1位置,再找2位置,再找3位置
-
this修饰,找2位置
-
super修饰,找3位置
2.5 继承中成员方法的访问特点
同样为
就近原则:
如果本类中有就会调用子类的,如果没有就会调用从父类中继承下来的
方法的重写:当父类中的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:在继承体系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法是重写的
@Override重写注释:
-
@Override是放在重写后的方法上,校验子类重写时语法是否正确
-
加上注解后如果有红色波浪线,表示语法错误
-
建议重写方法都加上@Override注解,代码安全优雅
方法重写本质:如果发生了重写,则会覆盖
方法重写注意事项:
-
重写方法的名称,形参列表必须与父类中的一致
-
子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
-
子类重写父类方法时,返回值类型必须小于等于父类
-
建议:重写的方法尽量和父类保持一致
-
只有被添加到虚方法表中的方法才能被重写
2.6 继承中构造方法的访问特点
-
父类中的构造方法不会被子类继承
-
子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
怎么调用父类的构造方法?
-
子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行
-
如果想调用父类有参构造,必须手动写super调用
3、多态
3.1 多态简述
多态的应用场景:
为Teacher,Student,administrator三种对象设计注册方法
什么是多态:
同类型的对象,表现出的不同形态
多态的表现形式:
父类类型 对象名称 = 子类对象;
多态的前提:
-
有继承关系
-
有父类引用指向子类对象
-
有方法重写
3.2 多态调用成员特点
-
变量调用:编译看左边,运行也看左边(调父类的)
-
方法调用:编译看左边,运行看右边 (调子类的)
多态内存图:
3.3 多态的优势及弊端
优势:
-
在多态形式下,右边对象可以实现解耦合,便于扩展和维护
-
定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展性与便利
弊端:不能调用子类特有的功能
原因:父类中没有子类的特有方法
解决方法:将对象强转为子类类型
//父类Animal , 子类 Dog Cat
Animal a = new Dog();
if(a instanceof Dog) { //instanceof:判断a是否是Dog类的对象
Dog d = (Dog) a;
d.lookHome(); //Dog类的特有方法
} else if(a instanceof Cat) {
Cat c = (Cat) a;
c.catchMosue(); //Cat类的特有方法
} else {
System.out.println("无法转换");
}
4、包、final
4.1 包
包的作用:
包就是文件夹,用来管理各种不同的Java类,方便后期代码维护
包的命名规则:
公司域名反写+包的作用,需要全部英文小写,见名知意
什么是全类名:
包名+类名
使用其他类的规则:
-
使用同一个包中的类时,不需要导包
-
使用java.lang包中的类时,不需要导包
-
其他情况都需要导包
-
如果同时使用两个包中的同名类,需要使用全类名
4.2 final关键字
-
final修饰方法:表明该方法是 最终方法,不能被重写
-
final修饰类:表明该类是 最终类,不能被继承
-
final修饰变量:叫做 常量,只能被赋值一次
常量:
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规则:
-
单个单词:全部大写
-
多个单词:全部大写,中间用下划线隔开
细节:
-
final修饰基本数据类型,数据不可更改
-
final修饰引用数据类型,记录的地址值不可改变,但实际的数据可以更改
5、权限修饰符
使用规则:
-
实际开发中,一般只用private和public
-
成员变量私有
-
方法公开
6、代码块
6.1 局部代码块
(有些过时)
特点:变量用完之后马上回收内存
作用:提前结束生命周期
6.2 构造代码块
(不够灵活,仅做了解)
构造代码块:
写在成员位置的代码块
作用:
可以把多个构造方法中重复的代码抽取出来
执行时机:
创建本类对象时,会先执行构造代码块,再执行构造方法
原先的代码重复
用构造代码块改后的代码
6.3 静态代码块
(重点)
格式:
static{}
特点:
需要通过static关键字修饰,随着类的加载而加载,并且自动触发,执行一次
使用场景:
在类加载的时候,做一些
数据初始化时使用。
7、 抽象类和抽象方法
7.1 定义
抽象方法:将
共性的行为(方法)抽取到父类之后,由于每个子类执行的内容是不一样的,所以,在父类中不能确定
具体的方法体。该方法就可以定义为抽象方法。
抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
7.2 定义格式
抽象方法的定义格式:
public abstract 返回值类型 方法名(参数列表);
抽象类定义格式:
public abstract class 类名{}
7.3 注意事项
-
抽象类不能实例化
-
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
-
可以有构造方法
-
抽象类的子类:
-
要么重写抽象类中的所有抽象方法
-
要么是抽象类
-
7.4 作用
-
抽取共性时,无法确定方法体,就把方法定义为抽象的。
-
强制让子类按照某种格式重写。
-
抽象方法所在的类,必须是抽象类
8、 接口
8.1 什么是接口
接口就是一种规则,是对
行为的抽象
8.2 接口的定义和使用
-
接口关键字用interface来定义
public interface 接口名{}
-
接口不能实例化
-
接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
-
接口的子类(实现类)
-
要么重写接口中所有的抽象方法
-
要么是抽象类
-
8.3 注意事项
-
接口和类的事项关系,可以是单实现,也可以是多实现
-
实现类还可以在继承一个类的同时实现多个接口
8.4 接口中成员的特点
-
成员变量:
-
只能是常量
-
默认修饰符:public static final
-
-
构造方法:
-
没有
-
-
成员方法:
-
只能是抽象方法(JDK7以前)
-
默认修饰符:public static abstract
-
8.5 接口和类之间的关系
-
类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
-
类和接口的关系:可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
-
接口和接口的关系:继承关系,可以是单继承,也可以是多继承
9、内部类
9.1 什么是内部类
内部类是类的五大成员之一。
类的五大成员:属性,方法,构造方法,代码块,内部类
9.2 什么时候用内部类
-
内部类表示的事物是外部类的一部分
-
内部类单独出现没有任何意义
9.3 成员内部类
(了解)
-
写在成员位置的,属于外部类的成员
-
成员内部类可以被一些修饰符所修饰
-
在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
获取成员内部类对象:
-
在外部类中编写方法,对外面提供内部类的对象
-
直接创建格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
内部类的内存图:
9.4 静态内部类
(了解)
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。
9.5 局部内部类
(了解)
-
将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
-
外界是无法直接使用,需要在方法内部创建对象并使用
-
该类可以直接访问外部类的成员,也可以访问方法内部的局部变量
9.6 匿名内部类
匿名内部类本质上就是隐藏了名字的内部类
格式:
new 类名或者接口名() {
重写方法;
};
格式的细节:
包含了继承或实现,方法重写,创建对象
整体就是一个属于类的子类对象或者接口的实现对象
使用场景:
当方法的参数是接口或者类时,一接口为例,可以传递这个接口的实现类对象
如果实现类只要使用一次,就可以用匿名内部类简化代码