内部类
1.1内部类概述
内部类就是指在一个类中定义一个类。举例:在一个类A的内部定义了一个类B,类B就称为内部类。
1.1.1内部类的定义格式
格式:
public class 类名{
修饰符 class 类名{
}
}
范例:
public class outer{
public class inner{
}
}
1.1.2内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类要访问内部类的成员必须创建对象
package com.itheima_05;
//外部类
public class Outer {
//外部类成员变量
private int age = 10;
//内部类
public class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
}
}
public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
}
}
1.2成员内部类
按照内部类在类中定义的位置不同,可以分为如下两种方式:
- 在类的成员位置:成员内部类
- 在类的局部位置:局部内部类
成员内部类,外界如何访问创建对象使用呢?
格式:外部类名.内部类名 对象名 = new 外部类对象.内部类对象;
范例:Outer.Inner oi = new Outer().new Inner();
//外部类
public class Outer {
//外部类成员变量
private int age = 10;
//public的成员内部类
public class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
}
}
public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
}
}
//测试类
public class InnerDemo {
public static void main(String[] args) {
//内部类是public权时创建内部类对象并调用方法
//错误写法 Inner i = new Inner();
Outer.Inner oi = new Outer().new Inner();
}
}
//外部类
public class Outer {
//外部类成员变量
private int age = 10;
//private成员内部类
private class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
}
}
public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
//内部类是private权时创建内部类对象并调用方法
Outer o = new Outer();
o.method();
}
}
虽然没法直接调用内部类的方法,但是可以通过外部类对外给出的接口来对内部类进行操作,类似于成员变量的get/set方法。
1.3局部内部类
局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
public class Outer {
//外部类成员变量
private int age = 10;
public void method(){
int age2 = 20;
//局部内部类
class Inner{
public void show(){
System.out.println(age);
System.out.println(age2);
}
}
Inner i = new Inner();
i.show();
}
}
//测试类
public class InnerDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
1.4匿名内部类
是局部内部类的一种特殊形式
前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法;
}
范例:
new Inter(){
public void show(){
}
}
匿名内部类本质上是一个继承了该类或者实现了该接口的子类匿名对象
public class Outer {
public void method(){
/*
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
这么写仅仅是new了一个对象
*/
/*
//这么写是对象调用方法
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
*/
Inter i = new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show();
}
}
public interface Inter {
void show();
}
public class OuterDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
1.5匿名内部类在开发中的使用
public class JumppingDemo {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
Cat c = new Cat();
//原来的方式,每次调用一次跳高操作类都要定义一个新对象并传入一个新对象
jo.method(c);
System.out.println("=============");
//匿名内部类
jo.method(new Jumpping() {
@Override
public void jumpping() {
System.out.println("猫会跳高");
}
});
jo.method(new Jumpping() {
@Override
public void jumpping() {
System.out.println("狗会跳高");
}
});
}
}