黑马程序员——Java基础---内部类

时间:2021-09-22 11:28:07

------<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>}