1.内部类的访问特点?
2.成员内部类定义在哪里?
3.成员内部类如何实现调用?提示:方法一、方法二
4.局部内部类定义在哪里?
5.局部内部类如何实现调用?提示:方法一、方法二
6.匿名内部类本质?
7.匿名内部类如何实现调用?提示:方法一、方法二
一、内部类的访问特点1.内部类可以直接访问外部类的成员,包括私有
2.外部类要访问内部类的成员,必须创建对象
二、内部类的分类 1.成员内部类:定义在类内部- 成员内部类,外界如何创建对象使用呢?
- 格式:外部类名.内部类名 对象名=外部类对象.内部类对象
package chart6;
public class demo6_7 {
private int num=10;
public class Inner{
public void show(){
System.out.println(num);
}
// public void method(){
// Inner inner=new Inner();
// inner.show();
// }
public static void main(String[] args){
// 方法一
demo6_7.Inner inner= new demo6_7().new Inner();
inner.show();
// 方法二
// demo6_7 demo6_7=new demo6_7();
// demo6_7.method();
}
}
方法二:间接调用,内部类修饰为private,不允许外部直接调用
- 在外部类建立method()方法通过new调用内部类
- 在主函数通过new方法调用外部类的method()方法,层层递进
package chart6;
public class demo6_7 {
private int num=10;
public class Inner{
public void show(){
System.out.println(num);
}
}
public void method(){
Inner inner=new Inner();
inner.show();
}
public static void main(String[] args){
// 方法一
// demo6_7.Inner inner= new demo6_7().new Inner();
// inner.show();
// 方法二
demo6_7 demo6_7=new demo6_7();
demo6_7.method();
}
}
2.局部内部类:定义在方法内部,外界无法直接访问
主函数想要调用内部类需要使用间接调用
调用逻辑:主函数->外部类.method()->内部类.show()
package chart6;
import org.omg.CORBA.PUBLIC_MEMBER;
public class Outer {
private int num=10;
int num2=20;
public void method(){
class Inner{
public void show(){
System.out.println(num);
System.out.println(num2);
}
};
// 创建内部类对象,并调用方法
Inner inner=new Inner();
inner.show();
};
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer outer=new Outer();
outer.method();
}
}
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量
3.匿名内部类:本质是一个继承了该类或者实现了该接口的子类匿名的对象前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法;
}
样例前提:匿名内部类需要实现的接口
package chart6;
public interface Inter {
void show();
}
方法一:匿名内部类.show()方法
在method方法内部直接通过new定义一个Inter类,主函数想要调用内部类的show()需要在匿名内部类的尾部追加【.show()】才能实现,这样做,如果想重复调用,则实现起来繁琐。
调用逻辑:主函数->外部类.method()->内部类.show()【通过.show()直接调用】
package chart6;
import com.sun.webkit.ContextMenu.ShowContext;
public class Outer2 {
public void method(){
// 方法一
new Inter(){
public void show(){
System.out.println("匿名内部类");
}
}.show();
// 方法二
// Inter inter=new Inter(){
// public void show(){
// System.out.println("匿名内部类");
// }
// };
// inter.show();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer2 outer2=new Outer2();
outer2.method();
}
}
方法二:类对象=匿名内部类
在method方法内部直接通过new定义一个Inter类,主函数想要调用内部类的show(),需要将匿名内部类赋值给一个对象变量,通过这个变量调用show方法
调用逻辑:主函数->外部类.method()->内部类变量.show()【内部类赋值给变量调用show()】
package chart6;
import com.sun.webkit.ContextMenu.ShowContext;
public class Outer2 {
public void method(){
// 方法一
// new Inter(){
// public void show(){
// System.out.println("匿名内部类");
// }
// }.show();
// 方法二
Inter inter=new Inter(){
public void show(){
System.out.println("匿名内部类");
}
};
inter.show();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer2 outer2=new Outer2();
outer2.method();
}
}
问题重现,如果回答不出来,请回看
1.内部类的访问特点?
2.成员内部类定义在哪里?
3.成员内部类如何实现调用?提示:方法一、方法二
4.局部内部类定义在哪里?
5.局部内部类如何实现调用?提示:方法一、方法二
6.匿名内部类本质?
7.匿名内部类如何实现调用?提示:方法一、方法二