1static关键字
1.1static概述
我们在学习static
关键字的时候需要提前弄明白java加载类的顺序。
我们可以先记住该顺序:
父类的static代码块—>子类的static代码块—>父类的代码块—>父类的构造方法—>子类的代码块—>子类的构造方法,其中static代码块在类中只加载一次,如果再次需要加载带有static
代码块的类时,第二次不加载,且如果有多个static
代码块,按照它们在类中所写的顺序来加载。
1.11static关键字的用处
- 用于修饰成员变量、成员方法(表示成员,后面不在复述)
- 用于静态代码块中
- 用于静态匿名内部类中
- 用于静态导包
1.12static关键词的理解
static
关键字表示静态的含义,通过类加载顺序可以发现,static
的加载在创建对象之前执行(构造方法之前),说明static
关键字是共享的。- 对象还未创建之前就初始化了,说明不能调用动态修饰对象的成员方法和成员变量,即通过初始化顺序说明,我们调用那些已经存在的事物,因此,本类的静态方法之间可以相互直接调用,本类动态方法可以直接调用静态方法。本类静态方法不能调用动态方法。动态方法调用别的类的动态成员需要先创建对象,通过对象来调用。动态方法调用别的类的静态成员通过对象来调用类名.调用即可。
1.13static的特点
通过上述的理解可以得出static
的特点
- static是一个修饰符,主要用于修饰成员
- static修饰的成员被所有的对象所共享(static修饰的成员在对象没加载前就初始化了,当然共享)
- static优先于对象存在
- static修饰的独特引用方式,在本类中直接调用成员名;调用别的类静态则需要类名.静态成员名
- static修饰的数据是共享数据,对象中存储的是特有数据
2this关键字和super关键字
2.1this和super关键字概述
this
关键字代表引用对象,即谁调用方法中的this
,this
就代表谁。super
关键字代表父类的引用对象。
可以看出第一个this代表name为小明的对象的地址值,第二个则是name为李华的地址值。
this
关键字用于解决局部变量和成员变量重名的问题,平常在javaBean类中构造方法赋值的操作。
public DishFlavor(Long id) {
this.id = id;
}
- 由于指代引用对象,因此this代表对象,而static在对象之前初始化了,所以this不能出现在static修饰的方法中。
- 我们平常调用的成员变量和成员方法都是默认加上this.的,因此有this.成员变量名、this.成员方法、this(…)代表调用构造方法,super对应则是父类中的super.成员变量名、super.成员方法、super(…),注意没有super.构造方法名的形式,这样调用编译时期就会报错。
- this()有要求必须放在构造方法的第一行,super()也要求在构造方法的第一行,因此二者不能共存。子类的构造方法中默认有super();如果需要调用有参的构造方法则需要手动调用 例如,super(String name);
3final关键字
final
关键字代表最终的意思,可以修饰成员、类
3.1final关键字的用处
final修饰用处 | 产生限制作用 |
---|---|
final修饰类 | 该类不能被继承(不能有子类,但是可以有父类) |
final修饰方法 | 该方法不能被重写 |
final修饰变量 | 表明该变量为常量,不能被再次赋值 |
final修饰变量时,变量类型不同限制的内容也不同
final修饰变量的类型 | 产生限制作用 |
---|---|
变量是基本数据类型 | 不能改变的是值 |
变量是引用类型 | 不能改变的是地址值,但是地址里面的内容还是可以改变 |
4abstract、interface和implements关键字
4.1概述
4.11abstract概述
abstract用于修饰抽象类,表示一种抽象的概念。在以前java工程师们总结了设计模式,这是长期积累下来的经验,而abstract则是对某类事物共同特征的一个抽象。例如,四轮车外观拥有不同的颜色,来满足用户的需求,我们在设计四轮车时,就可以将颜色这一方法设计为抽象方法,通过用户提交的颜色来个性化的设计车辆,而不是固定某一种颜色或者改动代码。
4.11interface和implements概述
interface则是对abstract的高度抽象,即接口里定义的都是抽象方法(jdk7及之前),如果某个抽象类全是抽象方法,可以考虑改写成接口。接口是一种规范。
接口的通过implements关键字来实现
4.2作用
4.21abstract特点
- 抽象类和抽象方法必须使用abstract关键字修饰
- 虽然抽象类可以有构造方法,但是抽象类不能被实例化
- 抽象类的子类要么重写抽象类的所有抽象方法,要么是抽象类
4.22interface和implements特点
- 接口interface关键字修饰,实现接口implements关键字
- 接口没有构造方法,更不可能实例化。我们可以创建接口的实现类对象使用里面的方法
- 接口的子类要么重写接口里面的所有抽象方法,要么子类也是抽象类(类前面再加上abstract关键字)
4.23类与接口的关系
类与接口关系 | 关系 |
---|---|
类与类的关系 | 继承关系,只能单继承,但是可以多层继承 |
类与接口的关系 | 实现关系,可以单实现,也可以多实现,还可以再继承一个类 的同时实现多个接口 |
接口与接口的关系 | 继承关系,可以多继承 |
4.24抽象类和接口的区别
通过上述分析,可以看出二者的区别
相同点:
- 抽象类和接口都不能直接实例化
- 抽象类的子类或接口的实现类都必须实现其全部的抽象方法,才可以实例化。否则该类仍然是抽象类
不同点:
- 关键词不同,抽象类子类使用extends关键字来继承抽象类,接口实现使用implements来实现接口
- 抽象类可以抽构造方法,而接口没有
- 抽象类的成员变量可以是普通变量,接口只能是用public static final 来修饰
- 抽象类可以被单继承,而接口可以被多继承和多实现
4.25不同版本jdk接口的区别
在jdk7及之前,接口中的方法只能是抽象方法,当时为了解决接口升级的问题,例如,游戏平台要求在原来的基础上添加新的功能,这个时候如果在接口添加方法,会导致之前实现这个接口的类全部编译错误,我们需要一个个去实现每个实现这个接口添加的方法,会出现有些类需要使用实现了的方法,但是并没有什么关系的类,居然还要去修改,显然这是我们不愿意看到的情况。如果有一种接口增加新的方法,只需要引用就好了,又不影响别的实现接口的类。什么时候会有这种情况呢?明显是接口中的方法有方法体的时候。这时候jdk8有了改进,称这类方法为默认或静态方法。
默认方法格式:
public default void show3() {
}
注意事项:
- 默认方法不是抽象方法,所以不要求被重写。但是可以被重写,重写的时候去掉default关键字
- public可以省略,default不能省略
- 如果实现多个接口,多个接口中存在相同的默认方法声明,子类就必须对该方法进行重写
静态方法格式:
public static void show3() {
}
注意事项:
- 静态方法只能通过接口名.的形式调用,不能通过实现类名或对象类名调用
- public可以省略,static不能省略
我们通过上面分析发现还是存在问题,接口默认方法重名必须重写的问题,这时候jdk9就引入private关键字私有提供隐蔽性,防止上述问题。
注意事项:
1.默认方法可以调用私有的静态方法和非静态方法
2.静态方法只能调用私有的静态方法
4.26不同jdk的接口总结
- jdk7及之前接口内都是抽象方法
- jdk8为了解决接口升级问题,引入static和default有方法体的方法格式
- jdk9为了解决jdk8出现接口方法重名必须重写的问题,引入private修饰符
5访问修饰符关键字
访问修饰符 | 同一个类 | 同一个包下 | 子类 | 不同包下 |
---|---|---|---|---|
public | yes | yes | yes | yes |
protected | yes | yes | yes | no |
default | yes | yes | no | no |
private | yes | no | no | no |
6致谢
参考相关文章,此处表示感谢
超链接http://t.csdn.cn/dV0v7
超链接http://t.csdn.cn/y1dr4
超链接http://t.csdn.cn/rOaOh