前言:通过对内部类的了解与学习,可以知道每个内部内都能独立的继承一个接口,不论外部类是否继承。因此内部类是多重继承的解决方案更加完整,且匿名内部类会使代码更加简洁,又起来更方便,但是只能使用一次。
内部类概念: 在B类内部定义A类,A类就属于B的内部类
内部类访问外部类的特点: 它可以直接访问外部了的成员,包括私有外部类访问内部类的特点: 通过创建内部类对象的方式间接访问...
内部类的分类: 成员内部类:在外部类的成员位置
局部内部类:在外部类的局部位置
匿名内部类:在外部类的局部位置
静态内部类:在外部类的成员位置
一.成员内部类 : 可以直接访问外部类的成员,包括私有。
外部类要访问内部类(非静态的内部类)的成员方法:格式:外部类名.内部类名 对象名 =new 外部类对象.new内部类对象
成员内部类的修饰符: private: 作用:保证数据的安全性!
static修饰:可以把静态内部类看成是外部类的成员.
举例:
class Outer3{
//外部类的成员变量
private int num = 10 ;
//成员内部类
class Inner3{
//show()
public void show() {
System.out.println(num);
}
}
}
//测试类
public class OuterDemo3 {
public static void main(String[] args) {
// 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer3.Inner3 oi = new Outer3().new Inner3();
oi.show();
}
}
二.局部内部类: 可以访问外部类的成员包括私有...
在外部类的局部位置去访问内部类的show(),需要在局部位置创建内部了对象,通过对象去访问
注释:局部内部类在调用外部局部变量是必须加上final修饰,
举例:
class Outer5{
private int num = 10 ;
//定义外部类的成员方法
public void method() {
//变量
final int num2 = 20 ; //jdk1.8不会有问题..
//定义局部内部类
class Inner5{
public void show() {
System.out.println(num);
//注意事项:在这块改变量继续被使用...将变量变成固定值:在内存始终存在(被内部类的成员去使用)
System.out.println(num2);
}
}
//创建对象
Inner5 i = new Inner5() ;
i.show(); //调用show()
}
}
public class OuterDemo5 {
public static void main(String[] args) {
//创建对象
Outer5 o = new Outer5() ;
o.method();
}
}
三.匿名内部类: 前提是有一个类或者接口
这个类可以是具体类也可以是抽象类
格式:new 类名或者接口名{
方法重写();
}
注释:如果重写的方法只有一个,直接在类后面调用,如果有多个,给匿名类一个名字,分别调用。
匿名内部类的本质: 是继承了该类或者实现了该接口子类对象...匿名内部类面试题: 按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
/**interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
* @author 田伟
*
*/
interface Inter {
void show();
}
class Outer {
public static Inter method() {
return new Inter(){
@Override
public void show() {
System.out.println("Hello World");
}
};
}
}
public class Text {
public static void main(String[] args) {
Outer.method().show();
}
}
四.静态内部类: 静态成员内部类访问外部类的数据,该数据必须static修饰
格式:外部类名.内部类名 对象名=new 外部类名.内部类名();把静态的成员内部类看成是外部类的成员
举例:
class Outer4{
private int num = 10 ;
private static int num2 = 100 ;
//成员内部类:静态的
static class Inner4{
//成员方法
//非静态的内部类成员方法
public void show() {
System.out.println(num2);
}
//静态的内部类的成员方法
public static void show2() {
System.out.println(num2);
}
}
}
//测试类
public class OuterDemo4 {
public static void main(String[] args) {
//对于静态的成员内部类的访问格式
//外部类名.内部类名 对象名 = new 外部类名.内部类名() ; //把静态的成员内部类看成了外部类的成员
Outer4.Inner4 oi = new Outer4.Inner4() ;
oi.show();
oi.show2();
}
}