类的高级概念
访问修饰符
类的每一个成员(包括成员变量,方法,构造器)都有一个访问修饰符,用来判断可以访问该成员
-
public公有的
作用范围:本类,同包类(同包子类,同包非子类),不同包类(不同包子类,不同包非子类)
-
protected保护的
作用范围:本类,同包类(同包子类,同包非子类),不同包类(不同包子类)
-
没有访问修饰符(默认访问)
作用范围:本类,同包类(同包子类,同包非子类)
-
private私有的
作用范围:本类
作用:限制属性和方法被使用和调用的范围。
如果一个类的组件被声明为私有类型,则任何该类的外部方法无法访问该组件。
封装
封装包括:
-
组装 类的定义
-
信息的隐藏
a.访问修饰符
b.方法的定义
标准java类
-
必须有公共无参构造
-
必须为私有属性提供符合命名规范的get/set方法
封装的好处
-
类的成员变量可以成为只读或者只写
-
类可以对存储在其成员变量中的内容有一个整体控制
-
类的用户不需要知道类是如何存储数据的
类的静态成员
class 类名{
public static String name;
}
static修饰属性:
-
用static修饰的属性,全类共享一个值
name这个属性将不再存放在每个对象身上,而是全类共享
无论哪个对象对该属性进行了改动,全类所有对象都被改动了
-
原因 static的属性是单独存放在内存中的静态区,而不是存放在每个对象身上。所以可以直接通过类名.的方式访问
-
特殊操作:可以通过类名.的方式直接操作
注意
能用static修饰的属性是很少的,除非真的能保证他是一个全类共享的值,否则不允许用static修饰
这个name在程序运行时,即加载期的时候就会放进内存
使用最多的场景
常量通常可以无脑设置为static
class 类名{
public static 方法名(){}
}
static修饰方法:
现象
-
可以通过类名.方法名()直接调用
-
static修饰的方法中不能出现this和super
-
static的方法中不能访问非static的属性行为
原因
-
加载期会先加载静态方法和属性,这时还没有对象产生
-
加载静态方法时还不认识费静态属性或非静态方法,因此会报错
特殊设计
只有工具类的工具方法才能定义为static(如果一个方法不需要执行到对象本身相关的数据或行为这个方法可以定义为static)
静态方法不能访问非静态成员
非静态方法可以访问静态成员
静态初始化块和实例初始化块
初始化块写在属性后面(类内部顺序 属性,初始化块,构造方法,普通方法)
实例初始化块
{
//初始化块
}
用一对大括号表示,初始化块在new对象时(初始化对象时)自动调用初始化块,每产生一个对象就调用一次初始化块。
注意
-
都是代码块,都已经有当前对象,所以凡是可以写在初始化块中的代码也可以写在构造方法中
-
构造方法内部的代码是在市里初始化块之后执行的,初始化最终结果以构造方法为准
静态初始化块
static{
//初始化块
}
默认在类加载的时候被自动调用
因为一个类只加载一次所以静态初始化块只调用一次。
注意
-
这是目前唯一一个再加载期就能执行的代码。
-
在加载期做事情,消耗的是加载期的时间,不会影响运行期时间。
初始化块是初始化一个对象要写的代码,宁愿写在构造方法里面。
本类所有构造方法都需要执行的共有代码,可以写在实例化块中,只需要写一次
内部类的使用方法
内部类分类:
-
成员内部类
直接写在外部类本身中,与外部类的属性,构造,行为,初始化块平行。
成员内部列除了定义的位置特殊外,仍是一个完整的类。
可以拥有属性,构造,行为,初始化块,甚至可以有他的内部类,是一个独立的类,拥有独立的.class文件,成员内部类可以像属性,行为,初始化块一样用static修饰成一个静态内部类
-
局部内部类直接写在外部类的某个方法里面的类,不能用public修饰
局部内部类除了定义的位置特殊以外,他们仍是一个完整的类
局部内部类有一个特例,匿名内部类
-
匿名内部类
是在new对象时同时给出类的定义
new Student(){
//类的属性,行为…
}
只能产生一个对象,只能在产生对象时用这一次