内部内有几种,为局部内部内,成员内部内,匿名内部内(局部内部类的一种),静态内部内,非静态内部内;
来说说这几个内部内。
如何访问内部内的成员:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
成员内部内:在成员位置定义的类叫做成员内部类局部位置。
例如:
public class Body{//外部类 身体
private boolean life = true;//生命状态
public class Heart{//内部类 心脏
public void jump(){//跳动
System.out.println("心脏在跳");
System.out.println("声明状态:" + life);//内部类方位外部类中的成员变量
}
public void setLife(boolean li){
life = li;//内部类能够调用外部类中的元素
}
public class blood{
public void print(){
System.out.println("我是心脏里面的血管");
}
}
}
}
public class BodyTest {
public static void main(String[] args) {
//创建一个内部类对象
Body.Heart bh = new Body().new Heart();
//调用内部类中的方法
bh.jump();
bh.setLife(false);
bh.jump();
Body.Heart.blood bhb = new Body().new Heart().new blood();
bhb.print();
}
}
局部内部类:在局部位置定义的类,被称为局部内部类。
例如:
public class Cat {//外部类
private String name = "大橘为重";
public void m(){
//局部变量如果在内部类中使用必须使用final进行修饰
final int age = 5;
//局部内部类不允许使用访问控制修饰符,只能使用final和abstract进行修饰
class say{
public void m2(){
System.out.println("喵喵喵喵喵");
}
}
//在定义局部内部类的方法中对局部内部类进行创建对象
new say().m2();
}
}
public class CatTest {
public static void main(String[] args) {
Cat c = new Cat();
c.m();
}
}
匿名内部类:匿名内部类的作用和格式
作用:匿名内部类是创建某个类型的子类对象的快捷方式
格式:
new 父类或接口(){
//进行方法重写
}
public class Demo {
public static void main(String[] args) {
//接口不能创建对象
Person p = new Person() {//这一对花括号中的内容就是匿名内部类
//实现接口中的所有的抽象方法就可以了
@Override
public void eat() {
System.out.println("吃米饭");
}
};
//如果对接口创建了对象,使用匿名内部类的方法是将接口中的方法实现了
//那么我们可以通过调用接口创建的对象将这个方法调用出来
p.eat();
}
}
静态内部内:是指在创建内部类的时候使用static修饰的内部类
在创建静态内部类的时候,不需要创建外部类对象
外部类名.内部类名 对象名 = new 外部类名.内部类名();
public class Outer {
private String name1 = "旺财";
static class Inner {
String name2 = "来福";
public void m(){
//1、静态内部类不能直接访问外部类中非静态的成员变量
//2、如果想要访问这些变量需要创建对象
System.out.println("外部类的成员变量:" + new Outer().name1);
}
}
//在静态内部类的外部成员的位置写一个方法,创建内部类对象,调用静态内部类的方法
public void m2(){
new Inner().m();
}
}
非静态内部类:
创建对象格式:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
}
}
静态内部类中可以定义静态成员和非静态成员。其他类在调用外部类中的静态内部类的时候,需要通过完整的类名访问静态内部类中的静态的成员.如果要访问静态内部类中的其他非静态成员,需要通过静态内部类的对象进行调用
public class Outer_02 {
static class Inner_02{
int a = 10;//静态内部类的非静态成员变量
static int b = 20;//静态内部类的静态的成员变量
}
}
public class OuterTest {
public static void main(String[] args) {
Outer_02.Inner_02 oi = new Outer_02.Inner_02();
System.out.println(oi.a);//访问静态内部类中非静态的变量
System.out.println(Outer_02.Inner_02.b);//访问静态内部类中静态的变量
}
}