权限修饰符
权限修饰符分为以下四类:
public 公共的 使用范围:本类 同包 子类
protected 受保护的 使用范围:本类 同包 子类(通过子类对象在子类范围内部访问)
默认不写 默认的 使用范围:本类 同包
private 私有的 使用范围:本类
权限修饰符用来修饰类的时候只能用public和默认不写这两种方式,修饰类成员(即属性、方法、构造函数)时,都可以用;
特征修饰符
final 最终的,不可更改的
修饰变量: 如果在定义变量时没有赋初始值,则给变量一次机会更改值。此后无法改动
修饰属性: 必须给属性赋一个初始值,否则编译报错。赋值后不可改动。
如果修饰的是引用数据类型,则变量内的地址引用不让更改,但是地址引用中存的值可以随意改变。
修饰类本身:此类无法被继承(通常是一些定义好的工具类)
修饰方法:方法是最终的方法,不可更改;final修饰的方法不可以被子类覆盖(重写)。
static 静态的
(1)可以修饰:修饰属性;修饰方法;修饰程序块:修饰类(内部类)
(2)特点:
对于这些特点,结合类的加载顺序就能够更好的理解了。https://blog.csdn.net/monologuezjp/article/details/99408114。
a.静态元素在类加载时就初始化了,创建非常早;
静态元素的初始化在任何类成员前面,只有当类中的所有静态成员加载完成后才会加载非静态成员。
b.静态元素存储在静态元素区中,每一个类有一个自己的区域,与别的类不冲突;
c.静态元素只加载一次,全部类对象及类本身共享;//例子:单例模式https://blog.csdn.net/monologuezjp/article/details/99409814
d.由于静态元素区加载的时候,有可能没有创建对象,可以通过类名字直接访问。
e.可以理解为静态元素不属于任何一个对象,属于类的。
f.静态元素区GC无法管理,可以粗暴的认为常驻内存。(栈内存创建开始用完即回收,堆内存通过GC(垃圾回收器)回收。)
g.非静态成员(堆内存对象里)中可以访问静态成员(静态区)
h.在静态成员中可以访问静态成员(因为两个都存在静态区里)
i.在静态成员中不可以访问非静态成员(因为静态成员创建的比非静态成员中早,可能访问不到非静态成员)
j.静态元素中不可以出现this或super关键字(静态元素属于类)
Abstract 抽象的
(用来描述事物,很不具体,没有具体的执行,只是个概念)
- 能修饰什么:修饰方法、类
- 修饰后的特点:
用abstract修饰的方法,只有方法的结构,没有方法的执行体。
抽象类中不一定有抽象方法;但抽象方法必须放在抽象类中或接口中。
抽象类有什么特点?
(1)抽象列含有构造方法,但是我们不能通过调用构造方法直接创建对象;
- 抽象类只能通过子类单继承来做事;
- 抽象类可以继承抽象类;
- 抽象类可以单继承具体类,但是一般不会出现。
- 具体类直接单继承一个抽象类----->不可以(必须将父类抽象方法具体化,或者子类也变成抽象类)
- 抽象类中可以全是具体成员;可以全是抽象方法(这时叫接口);
- 接口可以理解为是抽象类抽象到极致,还是一个类的结构,但是不能用class修饰,改用interface修饰
什么是接口
(通常是为了定义规则)?
- 有什么成员:
属性: 不能含有一般属性,只能含有公有的静态的常量(即所含属性必须为静态元素且必须赋值)
方法: 不能含有一般方法 只能含有公有的抽象方法(但是JDK1.8版本之后可以用default修饰具体方法)
块: 不能有块
构造方法: 不能含有构造函数
- 如何使用 :
不能创建对象;
只能通过子类实现来做事,可以多实现(implements)
Public void A implements b,c,d{
}
注意:
接口不能继承别的类;
抽象类可以直接(多)实现接口;
具体类不可以直接多实现接口,必须将接口中的抽象方法具体化,或者自己变成抽象类
*接口可以多继承接口 可以直接多实现
如图:接口(I)、抽象类(A)、具体类(C)之间的关系
native 本地的
在Java源代码中看到native,就表示看不到后续代码了;后续会调用其他编程语言执行内存操作。
例如Object类中的hashCode方法,就是native修饰的,该方法后续就是调用C/C++写的底层代码,而这个代码我们是看不见的。