一、static(共享)
static表示静态,是Java中的一个修饰符,可以修饰成员方法和成员变量。被static修饰的成员变量叫做静态变量,存储在堆空间的静态存储位置。静态变量被该类所有对象共享,不属于某一个特定的对象,而属于类。可以使用(类名.成员变量名)和(对象名.成员变量名)调用静态变量。静态变量随着类的加载而加载,优先于对象而出现的
被static修饰的成员方法叫做静态方法,静态方法多用在测试类和工具类中,在javabean类中很少使用,可以使用(类名.成员方法名)和(对象名.成员方法名)调用。
工具类:帮助我们做一些事情但是不描述任何事物的类,工具类的类名需要做到见名知意,构造方法私有化,并且提供静态方法。
static注意事项:
1.静态方法只能访问静态变量和静态方法
2.非静态方法可以访问静态变量和静态方法,也可以访问非静态的成员变量和成员方法
3.静态方法中不能出现this关键字
二、继承:
Java中提供一个关键字extends,用这个关键字可以让一个类和另一个类建立起继承关系,extends之前的类称为子类(派生类),extends后的类称为父类(基类或者超类),当类与类之间存在相同的内容并满足子类是父类中的一种就可以考虑使用继承来优化代码。
继承的格式:
public class 子类名 extends 父类名{}
使用继承的好处:
1.继承可以把多个子类中重复的代码抽取到父类中,得到父类的属性和行为,提高代码的复用性
2.子类可以在父类的基础上增加其他的功能,使得子类更加强大
继承的特点:
Java只支持单继承(一个子类只能继承一个父类),不支持多继承(子类不能同时继承多个父类),但支持多层继承(子类A可以继承父类B,父类B可以继承父类C);每一个类都直接或间接的继承于Object类
子类能够继承父类中的哪些内容:
1.构造方法:无论是否是私有子类都无法继承
2.成员变量:无论是否私有子类都能继承,但是私有成员变量子类无法调用
3.成员方法:非私有的成员方法子类能够继承,私有的成员方法无法被子类继承
继承中成员变量的访问特点:
1.就近原则:谁离我近我就用谁(局部——本类的成员变量——父类的成员变量)
2.this:调用本类中的成员变量
3.super:调用本类父类的成员变量
4.如果出现了重名的成员变量:先从局部位置开始往上找,接着从本类成员位置开始往上找,最后从父类成员位置开始往上找
继承中成员方法的访问特点:
1.就近原则:谁离我近我就用谁(局部——本类的成员方法——父类的成员方法)
2.this:调用本类中的成员方法
3.super:调用本类父类的成员方法
方法的重写:当父类的方法不能满足子类现在的需求时进行方法的重写。在继承体系中,子类出现了和父类中一模一样的方法声明,称子类这个方法为重写的方法
@Override重写注解:@Override是放在重写后的方法上,校验子类重写时语法是否正确,加上@Override后如果有红色波浪线,则表示语法错误。建议重写方法都加上@Override注解,这样会使得代码更加的安全。
方法重写注意事项和要求:
1.重写方法的名称、形参列表必须与父类中的一致
2.子类重写父类方法时访问权限子类必须大于等于父类
3.子类重写父类方法时,返回值类型必须小于等于父类
4.重写的方法尽量和父类保持一致
5.只有被添加到虚方法表中的方法才能被重写
继承中构造方法的访问特点:
1.父类中的构造方法不会被子类继承
2.子类中所有的构造方法都会默认先访问父类的无参构造再执行自己。子类构造方法的第一行语句默认都是super(),不写也存在,且super()必须在第一行
3. 如果需要访问父类的有参构造,则必须手动书写
this,super使用总结:
1.this:可以理解为一个变量,表示当前方法调用者的地址值
2.super:代表父类存储空间
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员变量 | this.成员方法(...) | this(...) |
super | super.成员变量 | super.成员方法(...) | super(...) |
二、多态:
多态是指同种类型的对象表现出不同的形态,使用多态可以将父类类型作为参数,接收所有的子类对象。
多态的表现形式:父类类型 父类对象 = 子类对象;
多态的前提:有继承/实现关系,有父类引用指向子类对象,有方法重写
多态调用成员的特点:
1.调用成员变量(编译看左边,运行看左边):用javac编译代码时会看左边的父类中有没有这个变量,如果有,则编译成功,如果没有则失败,运行时实际获取的是左边父类中成员变量的值。
2.调用成员方法(编译看左边,运行看右边):用javac编译代码时会看左边的父类中有没有这个方法,如果有,则编译成功,如果没有编译则失败,运行时实际运行的是右边子类中的方法。
多态的好处:
1.在多态形式下,右边的对象可以实现解耦合,便于扩展和维护
2.定义方法时使用父类类型作为形式参数,可以接收所有子类对象,体现多态的可扩展性
多态的弊端:
不能调用子类的特有功能(编译出错)——将父类对象转变为子类类型即可
if(父类对象 instanceof 子类类型)
{
子类类型 子类对象 = (子类类型)父类对象;
}
三、包:
包就是文件夹,用来管理各种功能不同的Java类,方便后期代码的维护。使用其他类时,需要使用全类名。使用同一个包中的类,不需要导包;使用java.lang包中的类时,不需要导包;其他情况都需要导包。如果同时使用两个包中的同名类,需要使用全类名。
包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意
四、final关键字:
final修饰的方法:该方法是最终方法,不能被子类重写(方法表示规则)
final修饰类:表明该类时最终类,不能被其他子类继承
final修饰变量:表明该变量为常量,只能被赋值一次,常量一般作为系统的配置信息,方便维护,提高可读性
常量命名规范:
1.单个单词全部大写
2.多个单词全部大写,单词之间用下划线隔开
final使用的细节:
1.final修饰的变量为基本类型,变量存储的数据值不能发生改变
2.final修饰的变量时引用数据类型,那么变量存储的地址值不能发生改变,对象内部的可以改变
五、Java中的权限修饰符:
权限修饰符是用来控制一个成员能够被访问的范围,可以用来修饰成员变量、方法、构造方法和内部类。
Java中权限修饰符的分类:
在Java中有四类权限修饰符,作用范围从小到大分别是(private<空着不写<protected<public)
修饰符 | 同一个类中 | 同一个包中的其他类 | 不同包下的子类 | 不同包下的其他类 |
private | 可以访问 | 不可以访问 | 不可以访问 | 不可以访问 |
空着不写 | 可以访问 | 可以访问 | 不可以访问 | 不可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | 不可以访问 |
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
使用规则:
1.在Java的实际开发中一般只用private和public
2.一般将每个类中的成员变量私有,而将其方法公开。但是如果一个方法中的代码是抽取其他方法中共性的代码,这个方法一般也设为私有
六、代码块:
1.局部代码块:提前结束变量的生命周期,节约计算机内存空间
2.构造代码块:写在成员位置的代码块;可以把多个构造方法中重复的代码抽取出来;在创建本类对象时就会先执行代码块再执行构造方法
3.静态代码块:在构造代码块之前加一个static;需要通过static关键字修饰,随着类的加载而加载,并且自动触发且只执行一次;在类加载时做一些数据初始化时使用
七、抽象类和抽象方法:
1.抽象方法:将共性的方法抽取到父类中,由于每一个子类执行的内容是不一样的,因此在父类中不能确定具体的方法体,该方法就定义为抽象方法。
public abstract 返回值类型 方法名(参数列表);
2.抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
public abstract class 类名{};
3.注意事项:
(1).抽象类不能实例化
(2).抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
(3).可以有构造方法
(4).抽象类的子类要么重写抽象类中的所有抽象方法;要么是抽象类
八、接口:
1.接口的定义和使用:接口使用interface来定义:
public interface 接口名{}
接口不能实例化,接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
接口的子类要么重写接口中的所有抽象方法,要么是抽象类
注意1:接口和类的实现关系可以是单实现,也可以是多实现,即一个类可以实现单个或者多个接口
public class 类名 implements 接口名1,接口名2{}
注意2:实现类还可以在继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1,接口名2{}
2.接口中成员的特点:
(1)成员变量:接口中成员变量只能是常量,默认修饰符为public static final
(2)构造方法:接口中没有构造方法
(3)成员方法:只能是抽象方法,默认修饰符为public abstract
3.接口和类之间的关系:
(1)类和类之间的关系:继承关系,只能单继承
(2)类和接口之间的关系:实现关系,可以单实现,也可以多实现
(3)接口和接口之间的关系:继承关系,可以单继承也可以多继承
4.JDK8后接口中新增的方法:
JDK8之后接口中可以定义带有方法体的方法;JDK8允许在接口中定义定义默认方法,需要使用关键字default修饰,可以解决接口升级的问题
接口中默认方法的定义格式:
public default 返回值类型 方法名(参数列表){}
注意事项:
(1).默认方法不是抽象方法,所以不强制被重写,但是如果被重写,重写时候需要去掉default关键字
(2).public可以省略,default不可省略
(3).如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
JDK8之后允许在接口中定义静态方法,需要使用static修饰,接口中静态方法的定义格式:
public static 返回值类型 方法名(参数列表){}
注意事项:
(1).静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
(2).public可以省略,static不能省略
JDK9之后允许在接口中定义私有的方法
private 返回值类型 方法名(参数列表){}——给默认方法服务
private static 返回值类型 方法名(参数列表){}——给静态方法服务
接口代表规则,是行为的抽象,想让哪个类拥有一个行为,就让这个类实现对应的接口即可;当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态
九、内部类:
在一个类的里面再定义另外一个类,内部类表示的事物是外部类的一部分,单独出现没有任何意义
内部类的访问特点:
1.内部类可以直接访问外部类的成员,包括使用private修饰的内容
2.外部类要访问内部类的成员时必须创建内部类的一个对象
成员内部类:写在成员位置的,属于外部类的成员;成员内部类可以被一些修饰符所修饰:private,默认,protected,public; 在内部类里面可以定义静态变量
创建成员内部类对象:
1.在外部类中编写方法,对外提供内部类的对象
2.直接创建格式
外部类名.内部类名 对象名 = 外部类对象.内部类对象;(内部类不用private修饰时才可以使用该方法创建内部类对象)
Outer.Inner oi = new Outer().new Inner();
内部类获取外部类的成员变量:外部类名.this.成员变量;
静态内部类:成员内部类前面使用static修饰; 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建外部类的对象
创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用非静态方法的格式:先创建对象,用对象调用
局部内部类:将内部类定义在方法里面叫做局部内部类,类似于方法里面的局部变量;外界无法直接使用,需要在方法内部创建对象并使用;该类可以直接访问外部类的成员,也可以访问方法内的局部变量
匿名内部类:匿名内部类的本质就是隐藏了名字的内部类,可以写在成员位置或者局部位置
创建匿名内部类对象的格式:
new 类名或接口名(){
重写方法;
};
包含了继承或实现,方法重写,创建对象
整体就是一个类的子类对象或者接口的实现类对象