1.概念
-
内部类就是类中之类,说白了就是在类里面还去定义一个类
-
作用就是相对安全一点,实现数据对外隐藏
2.内部类有哪些?
-
成员内部类(现阶段了解即可,因为你根本就不会这么写,所以只需要了解其调用规则即可)
-
局部内部类
-
静态内部类
-
匿名内部类
3.语法
- 看代码
4.特点
-
1.内部类可以访问外部类的所有成员,哪怕是私有的都可以访问
-
2.外部类如果要访问其自己的内部类成员,就必须创建其内部类的对象(就是对其内部类进行实例化)
public static void main(String[] args) {
// 如何调用Inner的method方法
Outer outer = new Outer();
// System.out.println("a===="+outer.a);// 因为a是私有的,无法调用
outer.method();//a===10
} }
class Outer{//外部类
//成员变量
private int a = 10;
//成员方法
public void method() {
//外部类如果要访问其自己的内部类成员,就必须创建其内部类的对象(就是对其内部类进行实例化) Inner i = new Inner();
i.method();
}
//成员内部类
class Inner{
// 成员内部类的成员方法可以访问到外部类的成员变量
public void method() {
System.out.println("a==="+a);
} }
局部内部类
public static void main(String[] args) {
// 如何调用print方法
Outer2 o = new Outer2();
o.method();
} }
class Outer2{
public void method() {
int num = 10; // 局部变量 生命周期随着方法调用而消失的,局部内部类不会随着方法消失而消失,因为gc回收是不定时回收,所以要加上final
// final修饰的变量 而是一个常量,存储位置和局部变量不同,存在一个常量池里面,就不会随着方法调用结束而消失
// 在jdk1.8之前是需要强制加上的,1.8之后对这个变量进行了处理,所以不需要加final
// 局部内部类
class Inner2{
public void print() {// 局部内部类成员方法
//num = 20; // num前面默认加了final,由final修饰的成员变量是常量 无法修改 System.out.println("num===="+num);//num====10
}
} // 实例化Inner2
Inner2 i = new Inner2();
i.print();
}
静态内部类
public static void main(String[] args) {
// 如何调用method方法?
// 这里不是在实例化Outer3 而是在实例化Inner3
// 因为static修饰的成员 变量 方法 内部类 ,都是可以通过类名直接.出来的
Outer3.Inner3 oi = new Outer3.Inner3();
oi.method();
// 可以直接.出来 Outer3.Inner31.method();
}
}
class Outer3{
// 静态内部类
static class Inner3{
public void method() {
System.out.println("静态内部类的成员方法...");
} }
// 静态内部类2
static class Inner31{
public static void method() {
System.out.println("静态内部类的成员方法...");
} } }
匿名内部类:没有名字的内部类
-
前提条件:
-
1.要求先存在一个类,或者一个接口(抽象类)
-
接口中有且只有一个抽象方法的时候,就用匿名内部类
格式:
new 类名/接口名
public static void main(String[] args) {
new Dog(){//相当于Dog的子类
@Override
public void eat() {
System.out.println("狗吃肉");//对方法的重写
}
}.eat();
}}
class Dog{
public void eat() {
}
}
等价于
public static void main(String[] args) {
cat c=new cat();
c.eat();
}}
class Dog{
public void eat() {
}
}
class cat extends Dog{
public void eat() {
System.out.println("猫吃肉");
}
public static void main(String[] args) {
Outer4 o = new Outer4();
o.method();
}
}
// 1.要求先存在一个类,或者一个接口(抽象类)
interface Inter{// 先决条件 一个接口
void print(); // 接口中的抽象方法
void show();// 第二个抽象方法
}
class Outer4 {// 外部类
// 定义一个有名字的内部类去实现Inter接口,并重写其抽象方法
class Inner4 implements Inter{
// 重写Inter接口的抽象方法
public void print() {
System.out.println("print方法...");
}
public void show() {
System.out.println("show方法...");
}
}
public void method() {
// 父类引用指向子类对象 多态的体现...
Inter i = new Inner4();
i.print();
i.show();
// 采用匿名内部类的形式去实例化Inter接口
// 父类引用指向子类对象 多态的体现...
// 父类引用指向了一个没有名字的子类对象
new Inter() {
public void print() {
System.out.println("print方法...");
}
public void show() {
System.out.println("show方法...");
}
}.show();
}