含义:定义在内部的一个类
分类:
根据位置不同:
Ⅰ.成员内部类
1.普通成员内部类
位置:类中方法外
格式:
【定义】:class 名字{……}
【调用】:外部类名.内部类名 命名 = new 外部类名().new 内部类名()
【注意】:
①内部类可以直接使用外部类的成员
②外部类使用内部类成员(包括私有成员)时,需要先实例化(外部类可以使用内部类私有成员,所以内部类成员没必要私有化)
2.私有成员内部类
【注意】:
私有化内部类时,不可直接访问该内部类,但是可以通过调用外部类的共有方法,间接访问
public class 私有的成员内部类 {
public static void main(String[] args) {
Body b = new Body();
b.show();
}
}
class Body {
private int height = 149;
private class Wo {
int age = 40;
public void speak() {
System.out.println(height + "\t" + age );
}
}
public void show() {
System.out.println(height);
//其他的类中,无法访问Wo类,所以只能在当前外部类Body中,创建Wo类对象
Wo w = new Wo();
w.speak();
}
}
3.静态成员内部类
格式:
定义:static class 命名{……}
【调用】:
外部成员名.内部成员名 命名 = new 外部成员名.内部成员名()
因为静态成员内部类加载时就创建,所以使用时,不需要实例化静态成员内部类
【注意】:
①静态成员内部类不可使用外部类中的非静态变量、方法。但是,外部类可以使用静态内部类的变量、方法
②由于是静态的所以随着加载而创建至静态区,所以不用创建静态内部类对象
public class 静态的成员内部类 {
public static void main(String[] args) {
Body.Gan bg = new Body.Gan();
bg.speak();
}
}
class Body {
private int height = 149;
static class Gan {
String color = "black";
public void speak() {
// System.out.println(height);//静态环境下不能直接访问非静态的变量
System.out.println(color);
}
}
public void show() {
System.out.println(height);
}
}
Ⅱ.局部内部类
位置:方法中
定义:定义在方法中的类
调用:通过调用含内部类的方法,间接调用局部内部类。
步骤:【先在含局部内部类的方法中实例化,然后通过调用该方法,从而间接访问局部内部类】
【注意】:
①外部不可直接访问局部内部类(内部类是不可见的);
②即使外部获取局部内部类对象,也不可访问类中变量、方法(如何让外界获取局部内部类:比如,该方法return 这个局部内部类)。
③局部内部类中可直接使用,包含该局部内部类的方法中的变量、方法。
根据表达形式:
1.普通局部内部类
public class demo_普通局部内部类 {
public static void main(String[] args) {
//普通局部内部类
class Wo implements Person1{
@Override
public void eat() {
System.out.println("普通局部内部类,吃饭了");
}
}
new Wo().eat();
}
interface Person1{
public abstract void eat();
}
2.【匿名内部类】
格式:
new 父类或者接口名(){
对父类或者接口中的方法的重写;
};
【注意】:
1)必须存在继承或者是接口的实现的关系
2)只能调用父类或者接口中定义的方法,不能调用自己特有的方法
3)不能向下转型,类名都没有
4)可以将匿名对象赋值给父类或者接口的引用
初版:
public class demo_匿名内部类 {
public static void main(String[] args) {
//匿名内部类
new Person() {
@Override
public void eat() {
System.out.println("吃饭了");
}
}.eat();
}
}
interface Person{
public abstract void eat();
}
3.【精简版匿名内部类】
使用lambda表达式
public class demo_精简匿名内部类 {
public static void main(String[] args) {
//精简版。lambda表达式
Person per = () -> System.out.println("lambda表达式,吃饭了");
per.eat();
//方法引用
Person1 per2 = System.out :: println;
per2.eat();//只是换行,因为没有打印任何内容
}
}
interface Person{
public abstract void eat();
}
PS:
【】表示重要,删除线表示已解决
学习记录所用,有问题望指出哦~