内部类
什么是内部类呢?简单来说就是在一个类中定义另外一个类,那么另外定义的这个类就叫做内部类。
访问特点:
A:内部类可以直接访问外部类的成员,包括私有。
B:外部类要访问内部类的成员,必须创建对象。
package exp_04;
class A{//创建外部类A
private int num=20;
class B{//创建内部类B
public void show(){
System.out.println(num);//内部类可以直接访问外部类私有成员
}
}
public void method(){//外部类方法,用来调用内部类的show方法
//要访问内部类的方法,必须要创建内部类对象
B b = new B();
b.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
A a = new A();
a.method();
}
}
内部类分类:
成员位置:成员内部类
局部位置:局部内部类
成员内部类如何在外界创建对象呢?我们可以通过下面的方法来创建内部类对象
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
class Outer{
//创建一个成员内部类
class Inner{
public void show(){
System.out.println("inner的show()");
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
//需求:创建上面的内部类对象,调用他的show方法
//创建内部类对象的格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
匿名内部类
匿名内部类
没有名字的局部内部类,就是内部类的简化写法
前提:
存在一个类或者接口
这里的类可以是具体类也可以是抽象类。
格式:
new 类名或者接口名() {
重写方法;
};
本质:
是一个继承了类或者实现了接口的子类匿名对象。
//创建一个接口
interface Animal{
public abstract void eat();
}
//创建一个外部类
class Outer2{
//创建一个show方法,方法中存在一个匿名内部类
public void show(){
//匿名内部类
//匿名内部类格式:new 类或者接口(){重写的方法}
//匿名内部类本质:就是一个继承了类 ,或者实现了接口 ,的子类或者实现类的匿名对象
new Animal(){
@Override
public void eat() {
System.out.println("动物爱吃肉");
}
}.eat();
}
}
public class InnerClassDemo2 {
public static void main(String[] args) {
//创建一个Outer2这个外部类对象
Outer2 o2 = new Outer2();
o2.show();
}
}
按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class InnerClassTest {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
分析:Outer类名能直接调用method方法,则说明Outer中有一个静态的method方法。Outer.method()能调用show方法,但show方法是一个抽象方法,需要一个实现了接口的类,则说明method方法中有一个内部类实现了show方法且method方法的返回值是Inter对象或实现Inter接口的对象,那么这里用匿名内部类最合适。
代码如下:
interface Inter { void show(); }
class Outer {
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("hello World");
}
};
}
}
class InnerClassTest {
public static void main(String[] args){
Outer.method().show();
}
}