package innerClass;
public class InnerClassTester {
public static void main(String[] args) {
//1 创建内部类对象
Outer.Inner obj1 = new Outer().new Inner();
obj1.func();
//2 内部类私有:外部类提供public方法访问内部类方法
Outer obj2 = new Outer();
obj2.providePublicFunc();
//3 静态内部类
//3.1 访问静态内部类的非静态方法
Outer.StaInner obj3 = new Outer.StaInner();
obj3.func();
//3.2 访问静态内部类的静态方法(通过类名访问)
Outer.StaInner.staFunc();
//4 局部内部类访问局部变量
Outer obj4 = new Outer();
obj4.local();
//5 匿名内部类
Outer obj5 = new Outer();
obj5.anonymous();
//6 匿名内部类作为参数
asPara(new AbstractClass() {
public void func() {
System.out.println("匿名内部类作为参数");
}
});
}
public static void asPara(AbstractClass ac) {
ac.func();
}
}
//抽象类:作为匿名内部类存在的前提(前提:存在一个类(具体类或者抽象类)或者接口)
abstract class AbstractClass{
public abstract void func();
}
//外部类
class Outer{
private String hello = "内部类可以访问外部类数据成员(包括私有成员)";
//内部类------------------------------
class Inner{
public void func() {
//内部类获取了外部类的引用Outer.this
System.out.println(Outer.this.hello);
System.out.println(hello);
}
}
//内部类私有---------------------------
private class PriInner{
public void func() {
System.out.println("内部类私有,外部类提供public方法访问");
}
}
//外部类提供public方法访问
public void providePublicFunc() {
PriInner pi = new PriInner();
pi.func();
}
//静态内部类--------------------------
static class StaInner{
//非静态方法
public void func() {
System.out.println("静态内部类的非静态方法");
}
//静态方法
public static void staFunc() {
System.out.println("静态内部类的静态方法");
}
}
//局部内部类---------------------------
//外部类中的成员方法local()
public void local() {
final String str = "局部内部类访问局部变量";
class LocInner{
public void func() {
//访问的局部变量要用final修饰,但jdk1.8不用
System.out.println(str);
}
}
//局部内部类只能在方法中访问
LocInner li = new LocInner();
li.func();
}
/*匿名内部类(是一个内部类) 前提:存在一个类(具体类或者抽象类)或者接口
* 本质:继承了该类或者实现该接口的一个子类匿名对象
* */
//外部类中的成员方法anonymous()
public void anonymous(){
new AbstractClass() {
public void func() {
System.out.println("重写抽象类中func()抽象方法");
}
}.func();
/*
相当于一个继承了AbstractClass的子类的一个对象obj,然后,obj.func();
思考1:若AbstractClass中还有一个抽象方法func1(),怎么调用?
方法:
AbstractClass ac = new AbstractClass() {
public void func() {
System.out.println("重写抽象类中func()抽象方法");
}
public void func1(){
System.out.println("重写抽象类中func1()抽象方法");
}
}
ac.func();
ac.func();
思考2:若匿名内部类中有自己定义的方法myFunc(),how?
思路:向下强转?but子类的类名是什么?
所以,匿名内部类针对一个方法比较好
* */
}
}
运行结果:
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦