------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.概述
内部类定义在另一个类中的类,称为内部类(Inner Class),包含内部类的类,称为外部类(Outer Class)应用场合:在窗体程序中进行事件处理分类:成员内部类,局部内部类,静态内部类,匿名内部类.
二.成员内部类
1)在外部类中访问内部类,可以访问内部类中的所有成员,包含private修饰的
2)在外部类外访问内部类,不能访问内部类中的private修饰的成员
3)在内部类中访问外部类,直接访问,如果内部类和外部类的变量名相同,可使用“外部类.this.变量”
<span style="white-space:pre"></span>public class Test1 {
<span style="white-space:pre"></span>public static void main(String[] args) {
<span style="white-space:pre"></span>Outer out=new Outer();//创建外部类的对象
<span style="white-space:pre"></span>out.print();//调用外部类的方法
<span style="white-space:pre"></span>//在外部类的外部创建内部类的对象,语法:外部类.内部类 对象名=外部类对象.new 内部类();
//Outer.Inner in=out.new Inner(); //必须先创建外部类的对象
Inner in=out.new Inner();
//System.out.println(in.age);//无法访问内部类的private成员
in.show();
<span style="white-space:pre"></span> <span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class Outer{ //外部类 <span style="white-space:pre"></span>private String name="tom";//外部类的成员变量 <span style="white-space:pre"></span>static String address="上海"; <span style="white-space:pre"></span>class Inner{ //内部类 private int age=20;//内部类中的成员变量 private String name="张三"; String address="北京"; public void show(){ String address="广州"; System.out.println("内部类中的show方法"); //3.在内部类中访问外部类 System.out.println("内部类中的name:"+this.name); System.out.println("外部类中的name:"+Outer.this.name); System.out.println("内部类中的age:"+age); System.out.println("内部类中的address:"+this.address); System.out.println("外部类中的address:"+Outer.address); System.out.println("内部类中的局部变量address:"+address); <span style="white-space:pre"></span> } <span style="white-space:pre"></span>} <span style="white-space:pre"></span>在外部类中访问内部类 <span style="white-space:pre"></span>public void print(){ System.out.println("外部类中的print方法"); Inner in=new Inner();//直接创建内部类的对象 System.out.println(in.age);//访问内部类的属性,可以访问private成员 in.show(); <span style="white-space:pre"></span>}
三. 局部内部类
也称为方法内部类,即定义在外部类的方法中的类
1)访问范围:只能在外部类的方法中使用,不能使用修饰符进行修饰
2)在局部内部类中不能访问外部类的方法中非final修饰的成员
<span style="white-space:pre"></span>public class Test1 {四 . 静态内部类
<span style="white-space:pre"></span>public static void main(String[] args) {
MOuter out=new MOuter();
<span style="white-space:pre"></span>out.show();
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class MOuter{
<span style="white-space:pre"></span>String name="tom";
<span style="white-space:pre"></span>public void show(){
final int age=20;
System.out.println("外部类中的show方法");
class MInner{ //局部内部类
String sex="male";
private String address="南京";
public void print(){
System.out.println("局部内部类中的print方法");
System.out.println("外部类中的成员变量name:"+name);
System.out.println("外部类中局部变量age:"+age);
}
}
//只能在外部类的方法中使用
MInner in=new MInner();
System.out.println(in.sex);
System.out.println(in.address);
in.print();
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
使用static修饰的成员内部类,不能访问外部类中非static成员
<span style="white-space:pre"></span>public class Test02 {
<span style="white-space:pre"></span>public static void main(String[] args) {
//创建静态内部类,无需创建外部类的对象
SInner in=new SInner();
in.show();
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class SOuter{
<span style="white-space:pre"></span>static String name="joy";
<span style="white-space:pre"></span>static class SInner{ //静态内部类
String sex="male";
public void show(){
System.out.println("静态内部类中的show方法");
System.out.println("外部类中的name:"+name);
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
五. 匿名内部类
即没有名字的内部类,因为此类只需要使用一次,所以没有起名字的必要
1)在创建匿名内部类时,必须作为new语句的一部分来声明,用法:
接口|抽象类 对象名 = new 接口|抽象类{
匿名内部类
}
2)在创建匿名内部类时,会自动创建一个匿名内部类的对象,并赋给变量
<span style="white-space:pre"></span>public class Test03 {
<span style="white-space:pre"></span>public static void main(String[] args) {
Service s=new Service(){//匿名内部类
//实现接口中的抽象方法
public void show(){
System.out.println("实现Service接口的匿名内部类");
}
};
s.show();
Animal pig=new Animal() {
public void play() {
System.out.println("你好");
}
public void show() {
System.out.println("你好啊");
}
}
pig.show();
pig.play();
Student stu=new Student(){
public void show(){
System.out.println("大家好");
}
};
stu.show();
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>//定义接口
<span style="white-space:pre"></span>interface Service{
<span style="white-space:pre"></span> //抽象方法
<span style="white-space:pre"></span>void show();
<span style="white-space:pre"></span>}<span style="font-family: Arial, Helvetica, sans-serif;">//抽象类abstract class Animal{</span>
<span style="white-space:pre"></span> String name; <span style="white-space:pre"></span>public void show(){ System.out.println("你好"); <span style="white-space:pre"></span>} <span style="white-space:pre"></span>public abstract void play();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>class Student{ <span style="white-space:pre"></span> public void show(){ System.out.println("你好啊"); <span style="white-space:pre"></span> }<span style="white-space:pre"></span>}