内部类:一个类在另一个类的内部
例如:在B类内部定义A类,A类就属于B的内部类
内部类访问外部类的特点:它可以直接访问外部了的成员,包括私有
外部类如何访问内部类的成员?
通过创建内部类对象的方式间接访问...
package org.westos.内部类;
class Outer{
intnum = 100 ;
privateint num2 = 200 ;
//Inner就是Outer的内部类
classInner{
//内部类的方法
publicvoid show() {
System.out.println(num);
System.out.println(num2);
}
}
//外部类的成员位置
publicvoid method() {
// show();
//只能创建内部类对象的方式
Inneri = new Inner() ;
i.show();
}
}
//测试类
public class OuterDemo {
publicstatic void main(String[] args) {
}
}
内部类的分类:
成员内部类:在外部类的成员位置
局部内部类:在外部类的局部位置
成员内部类:可以直接访问外部类的成员,包括私有
外部类要访问内部类(非静态的内部类)的成员方法:
格式:外部类名.内部类名对象名 = 外部类对象.内部类对象
注意:此方式不适合内部类是静态的
关于成员内部类的修饰符:
1. private: 作用:保证数据的安全性!
调用方式:在类中的另一个方法中调用该内部类成员
2.static:为了方便访问数据,可以把静态内部类看成是外部类的成员.
1>静态内部类只能访问访问外部类带static修饰的成员
2>对于静态的成员内部类的访问:
外部类名.内部类名 对象名=new 外部类名.内部类名()
可以这样理解:把静态的内部类看成外部类的静态成员
package org.westos.内部类;
class Outer3{
//外部类的成员变量
privateint num = 10 ;
//成员内部类
classInner3{
//show()
publicvoid show() {
System.out.println(num);
}
}
}
//测试类
public class OuterDemo3 {
publicstatic void main(String[] args) {
// 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer3.Inner3oi = new Outer3().new Inner3();
oi.show();
}
}
局部内部类:
A.可以访问外部类的成员包括私有...
B.在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类的方法
面试题:
局部内部类访问局部变量,那么会出现问题?(jdk7以前包括jdk7,这个有问题的)
会报错,需要给局部变量添加final修饰...
为什么这个局部变量必须用final修饰?
package org.westos.内部类;
//定义外部类
class Outer5{
privateint num = 10 ;
//定义外部类的成员方法
publicvoid method() {
//变量
finalint num2 = 20 ; //jdk1.8不会有问题..
//定义局部内部类
classInner5{
publicvoid show() {
System.out.println(num);
//注意事项:在这块改变量继续被使用...将变量变成固定值:在内存始终存在(被内部类的成员去使用)
System.out.println(num2);
}
}
//创建对象
Inner5i = new Inner5() ;
i.show(); //调用show()
}
}
public class OuterDemo5 {
publicstatic void main(String[] args) {
//创建对象
Outer5o = new Outer5() ;
o.method();
}
}
匿名内部类:相当于内部类的简化写法
前提是有一个类或者接口,(这个类可以是具体类也可以是抽象类)
格式:
new类名或者接口名{
方法重写();
};
匿名内部类的本质: 是继承了该类或者实现了该接口子类对象...
调用方式:
方式1.new 类名或者接口名(){重写方法}.方法名();
方法2.该方法适用内部类中有多个方法
类名 对象名=new 类名或者接口名(){重写方法一;重写方法二;}
对象名.方法一();
对象名.方法二();
package org.westos.内部类;
//定一个接口
interface Inter{
publicabstract void show();
publicabstract void show2() ;
}
//定义一个类实现这接口...
class Outer6{
//成员方法
publicvoid method() {
Interi = new Inter() {
publicvoid show2() {
System.out.println("show2...");
}
publicvoid show() {
System.out.println("show....");
}
};
i.show();
i.show2();
}
}
public class OuterDemo6 {
publicstatic void main(String[] args) {
//创建Outer6类的对象
Outer6o = new Outer6() ;
o.method();
}
}
匿名内部类的优点:用完后立即被垃圾回收器回收,
匿名内部类的缺点:只能用一次,