/*
内部类:
成员内部类(在外部类声明成员的地方创建一个类)
创建对象方式:
1)在外部类中定义一个方法并创建内部类对象
a.在另一个类中创建外部类的对象,并调用那个创建内部类对象的方法
2)在另一个类中创建内部类对象
a.外部类.内部类 变量名 = new 外部类().new 内部类()
注意:
1)如果是静态内部类在其他类中创建对象的访问方式为:外部类.内部类 变量名 = new 外部类.内部类()
2)如果成员内部类中出现了静态的成员,那么内部类必须用static修饰
3)如果成员内部类是私有的,那么创建内部类对象只能在外部类中提供方法创建
访问成员:
1)内部类访问外部类的变量
a.外部类和内部类不存在相同的成员变量
访问的是外部类的成员变量
b.外部类和内部类存在相同的成员变量
默认访问的是内部类的成员变量
访问外部类成员变量的格式为:外部类.this.变量名
局部内部类(在外部类方法里面创建一个类)
注意:如果局部内部类访问了局部变量,那么该变量需要使用final修饰(原因:因为生命周期不一致)
匿名内部类(没有类名的类)
匿名内部类使用的前提:必须继承一个父类或者是实现一个接口
格式:
new 父类(父接口){
匿名内部类的成员
}
注意:
1)如果只调用一个方法可以直接在创建内部类后面写 .方法名
a.格式:
new 父类(父接口){
匿名内部类的成员
}.方法名
b.可以直接调用内部类特有的方法
2)如果调用多个方法
a.第一个方法设置一个返回值,并返回这个对象
//抽象方法定义
abstract public AbsClass run();
匿名内部类中返回对象
public void sleep(){
System.out.println("狗在睡觉~~");
return this;
}
b.给对象一个变量名在调用
格式:
父类(父接口) 变量名 = new 父类(父接口){
匿名内部类的成员
}
变量名.方法
*/
//外部类
import java.util.*;
abstract class AbsClass{
abstract public void run();
//abstract public AbsClass run();
abstract public void sleep();
}
class Outer{
/*
String str1 = "外部类的str1";
String str2 = "外部类的str2";
public Outer(){}
定义一个方法并且创建内部类对象
public void newInner(){
Inner inner = new Inner();
inner.innerFuntion();
}
//内部类
static class Inner{
String str2 = "内部类的str2";
public Inner(){}
public void innerFuntion(){
System.out.println("我是内部类。。。。");
System.out.println(str1);
System.out.println(Outer.this.str2);
}
}
*/
public void outerFun(){
/*
new AbsClass(){
public void run(){
System.out.println("狗在跑。。。。");
}
public void sleep(){
System.out.println("狗在睡觉~~");
}
}.sleep();
*/
/*
new AbsClass(){
public AbsClass run(){
System.out.println("狗在跑。。。。");
//返会对象
return this;
}
public void sleep(){
System.out.println("狗在睡觉~~");
}
}.run().sleep();
*/
AbsClass absclass = new AbsClass(){
public void run(){
System.out.println("狗在跑。。。。");
}
public void sleep(){
System.out.println("狗在睡觉~~");
}
};
absclass.run();
absclass.sleep();
}
}
class Demo1 {
public static void main(String[] args) {
/*
Outer outer = new Outer();
outer.newInner();
*/
/*
Outer.Inner inner = new Outer().new Inner();
inner.innerFuntion();
*/
/*
Outer.Inner inner = new Outer.Inner();
inner.innerFuntion();
*/
Outer outer = new Outer();
outer.outerFun();
}
}