相关标签:
Java
包的作用和特点
- 包可以有多层
- 包的定义需要在第一行有效代码中(注释不算)
- 不同包之间的文件名可以相同
不同包之间的互相访问
- 只能访问不同包之间的类
- 导入包名
- 使用类的全名(包名.类名)
- 导入的是包下的类
- 关键字:import
- 使用import将包中的某个或某些类导入,相当于在当前的包中创建了导入的类
- 通配符:*
- 表示导入该包下所有的类
权限修饰符
- public
- 公共
- 可以修饰类、方法和成员变量
- 被public修饰的类可以被其所在的包下的其他类访问
- 一个Java文件中只能有一个被public修饰的类,且类名要与文件名相同
- protected
- 受保护的
- 可以修饰类和方法和成员变量
- 被protected修饰的类不能被不同包中的类访问,但可以被不同包中的子类访问
- default
- 默认
- 可以修饰类、方法和成员变量
- 不写任何其他的权限修饰符时即为default修饰符
- 被default修饰的类只能被同一个包中的其他内容访问
- private
- 私有
- 可以修饰方法和成员变量
- 被private修饰的成员只能被同一个类中的其他成员访问
权限修饰符总结
public | protected | default | private | |
---|---|---|---|---|
同一个类中 | √ | √ | √ | √ |
同一个包中的不同类 | √ | √ | √ | |
不同包中的子类 | √ | √ | ||
不同包中的类 | √ |
内部类的概述
- 内部类是类,同样是用来描述事物的
- 内部类的分类
- 成员内部类
- 局部内部类
- 匿名内部类
- 内部类不能用普通方式访问,只能通过其外部来访问,而内部类可以自由的访问外部类的成员,无论是否是私有成员
成员内部类的概述和使用
- 当事物中还有具体的事物时,就可以使用内部类来描述
- 定义在类中方法外
- 创建对象:
外部类名.内部类名 变量名 = new 外部类对象.new 内部类对象 Outer.Inner inner = new Outer().new Inner(); //此处的new Outer()可以看做是一个匿名对象
成员内部类的修饰符
- 如果成员内部类使用static修饰,那么该内部类会随着外部类的加载而加载,因此创建对象的方式可以为:
外部类名.内部类名 变量名 = new 外部类名.内部类对象 Outer.Inner inner = new Outer.Inner();
局部内部类的概述和使用
- 定义在方法内部的类
- 只能在局部方法中创建这个对象,一旦该方法弹栈,外部就访问不到这个局部类了
- (Jdk1.7)局部内部类访问局部变量必须使用final修饰
- 调用方法时,局部变量如果没有用final修饰,那么当这个方法弹栈之后这个变量就会消失,此时内部类就无法再访问这个变量了,用final修饰后,变量的生命周期会等同于外部类的生命周期,即使方法弹栈,此变量也会依然存在,内部类才可以访问到。(Jdk1.8中已无需用final修饰)
- (Jdk1.7)局部内部类访问局部变量必须使用final修饰
局部内部类的生命周期应小于等于他所在的方法,当方法弹栈之后,内部类也应消失,即使在方法体中调用局部内部类的方法去访问局部变量,那么内部类的方法应该是在外部方法弹栈之前加载进入栈内存。也就是说,在内部类的方法弹栈之前,外部的方法是不会弹栈的,因此不用final修饰也是合理的。
匿名内部类的概述和格式
- 类似于匿名对象,匿名内部类可以看作是一个没有名字的局部内部类
- 定义在方法体中
- 必须在定义匿名内部类的时候创建他的对象
- 格式:
new 类/接口(){ (创建继承这个类的子类对象)可以对父类的方法重写 (创建了实现接口的子类对象)必须对接口的方法进行实现 };
- 原理:创建了继承这个类或是实现这个接口的子类对象
匿名内部类的应用场景
- 通常在使用方法是接口类型参数,并该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。
- 简化书写,如果阅读实在费劲的话,可以写有名字的内部类