------- android培训、java培训、期待与您交流! ----------
内部类:用来高级封装数据
1把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
2内部类的访问规则
1可以直接访问外部类的成员,包括私有
2外部类要想访问内部类成员,必须创建对象
3内部类的分类
1成员内部类,和成员变量,方法同级
2局部内部类,类被定义在方法中
4成员内部类
1private 为了数据的安全性
2static 为了访问的方便性,也叫静态内部类
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
5局部内部类:将类定义在方法的内部
1局部内部类访问局部变量必须加final修饰。
2为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
6匿名内部类
1是局部内部类的简化形式
2前提
存在一个类或者接口
3格式:
new 类名或者接口名() {
重写方法;
}
4本质:
其实是继承该类或者实现接口的子类匿名对象
5匿名内部类在开发中的使用
当看到方法的参数抽象类,或者接口。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
练习1
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
//访问内部类局部变量
System.out.println(num);
//访问内部类的成员
System.out.println(this.num);
//访问外部类的成员格式
System.out.println(Outer.this.num);}}}
public static void main(Stromg [] args){
//创建对象的格式
Outer.Inner d=new Outer().new Inner();
d.show();}
结果:30,20,10
练习2,实现课堂匿名内部类:
interface Person {
public abstract void study();}
class PersonDemo {
//方法的参数是一个接口类型,没有给出接口的实现类
public void method(Person p) {
p.study();}}
class PersonTest {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(
//直接new接口,匿名内部类
new Person() {
public void study() {
System.out.println("我要去黑马,我要努力");
}
});
}
}
练习3:匿名内部类的面试题(补齐代码)
class OuterDemo {
public static void main(String[] args) {
//根据这个补齐代码
Outer.method().show(); //"HelloWorld"
}
}
//分析,方法只能用对象来调用,可以通过类名直接访问方法时,方法为静态的;
interface Inter {
void show();
}
class Outer {
//静态方法
public static Inter method() {
return new Inter() {//返回一个匿名类重写show()方法
public void show() {
System.out.println("HelloWorld");
}}}}
final关键字:修饰类,成员变量,局部变量 ,方法,切只可以显示的赋值一次,赋值之后值不可以改变(基本类型和引用类型分别是什么值)
来源:用于完善封装,因为继承打破了封装的安全性
重点:局部内部类方法局部成员变量时,要将局部变量修饰称final的
举例:总结归纳了final修饰的五个常用的地方
public final class FinalDic {1//类不能被继承
2//自定义常量,注意常量的书写格式
private static final String XIAO_MA="heima";
3//这里的fianl修饰的是fd这个引用,意思是在占内存中的地址值不变,即fd=0x0025
private static final FinalDic fd=new FinalDic();
4//表示子类不能修改这个方法,但是子类有这个方法的信息
private final void show(){
}
public void setName(final String name){
5 //final修饰的形参不能在方法内部改变值,否则编译不通过
//name="sdfs";
}}
总结:
1个人理解:因为一个方法在一个类中只能访问本类的方法和成员变量,也就是说,他们只用是平级的关系才可以访问,而我们为了简便,将实现一个接口直接在本类中,此时叫做匿名内部类对象的方法,再将这个放在方法的参数上时就可以直接调用了,所以叫做匿名内部类;
2访问内部类时必须先要有外类的对象来,因为他是一个成员,只不过引用变成了“外部类.内部类”
3fianl修饰的是自定义类型引用,意思是在占内存中的地址值不变,