1、访问修饰符
本类 | 同包类 | 不同包类 | |||
子类 | 非子类 | 子类 | 非子类 | ||
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | |
默认 | √ | √ | √ | ||
private | √ |
2、封装
外部操作私有属性,用set/get方法
封装的好处:类的成员变量可以成为只读或者只写的。
类可以对存储在其成员变量中的内容有一个整体的控制。
类的用户不需要知道类是如何存储数据的。
3、静态类成员、初始化块
4、内部类(把一个类定义在另一个类的内部)
特点:独立的class文件,同样需要编译,同样可以产生对象
分类:①成员内部类:位置:位于外部类的全局位
访问修饰符:决定能否在第三方类中使用该内部类
class文件名:外部类名字$内部类名字。
产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)
在内部类里面:属性:不能定义static的属性(常量可以是static)
方法:不能定义static的方法
可以访问外部类的任意属性和方法
使用this代表的是内部类对象
如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
在外部类里面:可以直接产生内部类对象,然后无视访问修饰符视情况调用其属性和方法
在第三方类中:产生内部类对象,必须先产生外部类对象
使用特殊外部类对象.new的语法产生内部类对象
根据访问修饰符视情况调用属性和方法
②成员内部类特例:静态内部类
位置:位于外部类的全局位置,但是添加static修饰符
访问修饰符:决定能否在第三方类中使用该内部类
class文件名:外部类名字$内部类名字
产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)
在内部类里面:属性:可以定义静态和非静态的
方法:可以定义静态和非静态的
非静态方法:只能访问外部类的静态属性和静态方法
this代表内部类对象
如果属性方法出现同名的情况,用外部类类名.的方式特制外部类中的属性方法
静态方法:只能访问外部类的静态属性和静态方法
在外部类里面:直接new出内部类对象
用对象名.的方式访问内部类的非static属性和方法,无视访问修饰符
用内部类类名.的方式访问内部类的static属性和方法,无视访问修饰符
在第三方类中:无需产生外部类对象,使用外部类类名.内部类类名的方式产生内部类对象
根据访问修饰符,调用属性和方法
③局部内部类:
位置:在外部类的某个方法内部
访问修饰符:没有
class文件名字:外部类类名&数字编号+内部类类名
产生对象:只能在内部类所在的方法中
在内部类中:只能定义非static的属性和方法(常量可以是static)
如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
this代表当前内部类对象
如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
无法访问内部类所在方法的变量,只能访问常量
在外部类中:直接new出来即可
无视访问修饰符视情况调用其属性和方法
④局部内部类特例:匿名内部类
位置:在外部类的某个方法内部,new对象的同时定义属性行为,所以只能用这一次
访问修饰符:不存在
class文件名:外部类的类名&数字编号
在内部类中:只能定义非static的属性和方法(常量可以是static)
如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
this代表当前的匿名内部类对象
如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
无法访问内部类所在方法--即outMethod()中的的局部变量,只能访问常量