权限修饰符
名称 | 可以修饰的对象 | 能够被访问的范围 |
---|---|---|
public | 类(一个文件中只能有一个被public修饰的类),属性,方法,构造方法 | 本类,同包,当前项目中任意类位置只要有对象就可以访问 |
protected | 属性,方法,构造方法 | 本类,同包,子类(通过子类对象在子类范围内可以访问) |
默认不写 | 类,属性,方法,构造方法 | 本类,同包 |
private | 属性,方法,构造方法 | 本类 |
特征修饰符
final
-
修饰变量
-
如果变量没有赋值,给一次机会,如果变量有值,不允许再次改变
变量是基本类型,值不可改变
变量是引用类型,地址引用不可改变
修饰变量
- 特点与修饰变量类似,修饰属性必须赋初始值,否则编译报错。这是因为变量有默认值null,如果不赋初始值,那么加上final修饰之后,变量的值就已经无法改变了。 修饰属性
- 方法是最终的不可更改的,方法不能被 子类重写(覆盖) 修饰类
-
类是最终的(太监类,不能有子类)类不可以被其他子类继承
常见的工具类都是final修饰的,比如String,Math,Scanner,Integer
static
可以修饰:修饰属性 ,修饰方法,修饰块,修饰类(内部类)
特点
- 静态元素在类加载时就初始化了,创建的非常早,此时没有创建对象
- 静态元素存储在静态元素区中,每一个类有自己的区域,与别的类不冲突
- 静态元素只加载一次(只有一份),全部对象及类本身共享
- 由于静态元素区加载的时候,有可能没有创建对象,可以通过类名直接访问
- 可以理解为静态元素不属于任何一个对象,它属于类
- 内存管理,栈内存创建开始用完就回收,堆内存通过GC(垃圾回收机制)回收,静态元素区GC无法管理,可以粗暴任务静态元素时常驻内存
- 非静态成员(堆内存对象里)中可以访问静态成员(静态区),
- 静态成员中不可以访问非静态成员(个数 一个(静态元素)出发访问一堆相同名字的东西)(静态元素属于类 非静态成员属于对象自己)
- 静态元素中不可以出现this或super关键字(因为静态元素属于类)
abstract 抽象的(没有具体的执行,只是个概念)
可以修饰什么?
修饰方法 :用abstract修饰的方法,只有方法的结构,没有方法执行体叫做抽象方法
修饰类 :用abstract修饰的类 叫做抽象类
修饰以后有什么特点?
抽象类中不一定含有抽象方法,抽象方法必须放在抽象类中(或接口中),普通类中不允许含有抽象方法。(通常用来描述事物)
什么是抽象类,抽象类有什么特点?
public abstract A{
public abstract void fun();
}
-
抽象类中的成员:
- 属性 ------- 可以含有一般的属性,也可以含有private static final等
-
方法 ------- 可以含有一般的方法,也可以含有private static final等
注意:抽象类中允许含有抽象方法 - 块 ---------- 可以含有一般的程序块,也可以含有static程序块
- 构造方法 - 可以含有构造方法,包括重载 抽象类如何使用?
- 抽象类含有构造方法 但是我们不能通过构造方法直接创建对象
- 抽象类只能通过子类继承来做事
-
为什么抽象类不让直接创建对象,还有构造方法?
因为抽象类本身来说属于残次品,功能不全,所以不希望直接创建对象,但是可以通过子类继承来完善功能,所以需要构造方法。
类和类的关系
-
抽象类 ---- 直接单继承 ---- 抽象类 可以
: 抽象类 ---- 直接单继承 ---- 具体类 可以(但现实不这么干) - 具体类 ---- 直接单继承 ---- 抽象类 不可以(要将父类的抽象方法具体化,或者子类也是抽象类)
小问题:
抽象类中可以没有抽象方法,全部都是具体成员
抽象类中可以没有具体成员,全部都是抽象方法 ----> 接口
接口可以理解为抽象类抽象到极致,但还是一个类结构,不用class修饰,改用interface修饰
什么是接口?
接口也是一个类结构,只不过用interface修饰,只定义规则,功能,不描述具体过程
-
接口中的成员
- 属性 --------- 不能含有一般属性,只能含有公有的静态的常量 public static final
- 方法 ---------不能含有一般的方法,只能含有公有的抽象的方法(1.8 可以用default来修饰一般的方法)
- 块 ------------ 没有块,因为块就是具体的,接口中不可以有具体的成员
- 构造函数 – 不能含有构造方法 如何使用?能否创建对象?
- 不能创建对象,只能通过子类多实现(implements)来做事
public class A implements B,C,D{
}
与别的类结构关系
接口 -------- 继承 --------------- 普通类/抽象类 不可以
抽象类 ----- 直接多实现 ------ 接口 可以
具体类 ----- 直接多实现 ------ 接口 不可以(必须将接口中的抽象方法具体化,或者自己变成抽象类)
*接口 ------ 多继承 ------------ 接口 可以直接多实现
native
Java源代码中看到native就已经再也看不见后续代码
后续会调用其他的编程语言C/C++执行内存的操作
Object类中的一个方法 hashCode()
源码 public native int hashCode();