内部类
什么是内部类?
简单来说就是:类中定义类
什么时候需要定义内部类?
当一个类中的成员也是另外一个事物的时候,这个事物就可以使用内部类定义
内部类有很多,分为以下几种:
成员内部类 静态内部类 局部内部类 私有内部类 匿名内部类 (重点学习)
1. 成员内部类
/*
成员内部类:
内部类处于外部类的成员位置
是外部类的成员,就可以使用成员修饰符
是个类,有类的特性,继承,实现接口...
注意:
内部类中可以使用外部类中所有的内容,包括私有的
除了静态内部类以外的内部类中不可以定义静态的内容,除了静态的常量
在外部类中使用内部类中的成员,通过内部类的对象去使用
*/
public class Outer01{
private int a=5;//成员变量
String haha="123";
//内部类
public class Inner{
int b=3;//内部类中的成员变量
static final int c=10;
String haha="456";
public void inner(){
String haha="789";
System.out.println("我是内部类中的成员方法");
System.out.println(b);
System.out.println(a);
//局部haha
System.out.println(haha);
//内部类成员haha
System.out.println(this.haha);
//外部类成员haha
System.out.println(Outer01.this.haha);
}
}
//外部类中的成员方法
void outer(){
//内部类对象
Inner in=new Inner();
System.out.println(in.b);
}
}
2. 静态内部类
/*
静态内部类:
成员内部类一旦被static关键字修饰,就是静态内部类
注意:
如果在外部类中使用静态内部类中的成员,需要跟随内部类对象使用,如果使用静态内部类中的静态内容,直接类名.调用
如果在静态内部类中使用外部类中的成员,都要跟随外部类对象使用,如果使用静态内容,在内部类中可以直接使用
*/
public class Outer02{
private int a=5;
private static int b=10;
//静态内部类
static class Inner{
String name ="张三";
static int age =15;
void test1(){
System.out.println("我内部类中的成员方法");
//直接使用
System.out.println(name);
//直接使用
System.out.println(age);
//在静态内部类中使用外部类中的成员,都要跟随外部类对象使用
Outer02 out=new Outer02();
System.out.println(out.a);
//静态内部类中可以直接使用外部类中的静态成员
System.out.println(b);
}
}
void outer(){
//使用静态内部类中的静态内容,直接类名.调用
System.out.println(Inner.age);
//在外部类中使用静态内部类中的成员,需要跟随内部类对象使用
Inner in=new Inner();
System.out.println(in.name);
//调用静态内部类中成员方法
in.test1();
}
}
3. 私有内部类
/*
私有内部类:
成员内部类如果一旦被private关键字修饰,就是私有内部类
私有内部类只能在当前所定义的外部类中使用,其他类中无法使用
在外部类中可以通过内部类的对象使用内部类中的内容,保护私有的内容
*/
public class Outer03{
private int a=5;
//私有内部类
private class Inner{
private int b=10;
void inner(){
System.out.println(a);
System.out.println(b);
}
}
void outer(){
//创建内部类中的对象
Inner in=new Inner();
//使用内部类中的内容
System.out.println(in.b);
}
}
4. 局部内部类
/*
局部内部类:
局部内部类只能在当前所定义的方法中使用,其他方法,其他类中无法使用
局部内部类中使用到当前所在的方法参数时,这个参数的默认值被final修饰
如果修改就不能在内部类中使用
如果在局部内部类中使用就不能修改其参数值
*/
public class Outer04{
String name ="李四";
void test(int i){
//局部变量
int a = 10;
//局部内部类
class Inner{
void inner(){
System.out.println(a);
System.out.println(name);
System.out.println(i);
}
}
//方法中通过内部类的对象使用成员
new.Inner().inner();
}
}
5. 匿名内部类
/*
匿名内部类:
如果某个实现类本身没有自己的作用,为了重写某些抽象方法的,可以使用匿名内部类进行代替
*/
public class Anonymous05{
public static void main(String[]args){
//匿名内部类
//一个Swim接口|抽象类的一个不知名的实现类的对象
//只能当前行使用一次
new Swim(){//--->类体
@Override
public void swimming(){
System.out.println("一边游泳一边敲代码");
}
@Override
public void eat(){
System.out.println("少吃,营养进食");
}
}.swimming();
//有引用接收的匿名内部类对象
Swim s = new Swim(){//--->类体
@Override
public void swimming(){
System.out.println("一边游泳一边敲代码");
}
@Override
public void eat(){
System.out.println("少吃,营养进食");
}
};
s.swimming();
s.eat();
//作为方法的参数使用
test(new Swim()){
@Override
public void swimming(){
System.out.println("游泳喝水两不误");
}
@Override
public void eat(){
System.out.println("一边吃一边喝");
}
});
}
static void test(Swim s){
s.swimming();
}
}
//游泳接口
interface Swim{
void swimming();
void eat();
}
/*
//Demo类实现Swim接口
class Demo implements Swim{
@Override
public void swimming(){
System.out.println("一边跳舞一边游泳");
}
}
*/