内部类

来源:互联网 发布:北京电脑编程学校 编辑:程序博客网 时间:2024/06/05 15:15
 1.内部类的概述:
  在一个类中定义另一个类,内部类
  举例:在A类中定义了一个B类,B就是A类的内部类,A类叫做外部类!
 
 
  内部类的访问特点:
  内部类可以直接访问外部类的成员,包括私有!
 
  外部类直接可以直接访问内部类的成员吗?
  外部类不能直接访问内部类的成员!
  需要在这里创建内部类对象,通过内部类对象使用方法
class Outer{private int num = 10;class Inter{//定义一个内部类public void show(){System.out.println(num);//内部类可以直接访问外部类的成员 包括私有}}public void method(){ //show();外部类不能直接访问内部类方法Inter i = new Inter();//通过创建内部类对象来使用方法i.show();}}


2.内部类的分类:
  成员内部类:在外部类的成为位置
  局部内部类:在外部类的局部位置


class Outer2{private int num = 10 ;//成员位置//成员内部类//class Inner2{////}public void method(){//局部位置//局部内部类!class Inner2{}}}


3.成员内部类:
  如何访问内部类(非静态)的成员?
 
  注意:不能直接创建对象:
  格式:外部类名.内部类名 对象名 = 外部对象.内部类对象;
class Outer1{private int num = 10;class Inner1{public void show(){System.out.println(num);}}}public class Demo1 {public static void main(String[] args) {//Inner1 i = new Inner1();//i.show();//格式:外部类名.内部类名 对象名 = 外部对象. 内部类对象Outer1.Inner1 oi = new Outer1().new Inner1();oi.show();}}


4.如何访问内部类(静态)的成员?
class Outer2 {private int num = 10;private static int num2 = 20;//静态的内部类访问的外部类数据,外部类的成员必须是静态的public static class Inner2{public void show(){//System.out.println(num);System.out.println(num2);//只能访问静态成员变量}public static void show1(){//System.out.println(num);System.out.println(num2);}}}public class Demo2 {public static void main(String[] args) {//成员静态内部类访问自己成员//外部类名.内部类名 对象名 = new 外部类名.内部类名();Outer2.Inner2 oi2 = new Outer2.Inner2();oi2.show();//20oi2.show1();//20//show2()是成员内部类的一个静态方法,还有另一种方式访问:Outer2.Inner2.show1();//20}}


5.局部内部类:
  局部内部类的成员直接可以访问外部类的数据
  局部位置访问成员内部类中成员方法,创建局部内部类对象,访问show
  class Outer3{private int num = 20;public void method(){//int num2 = 30;final int num2 = 30;//局部变量必须是常量class Inner3{//局部内部类public void show(){System.out.println(num);//访问外部类变量System.out.println(num2);}}Inner3 i = new Inner3();//访问show()方法i.show();}}public class Demo3 {public static void main(String[] args) {Outer3 o = new Outer3();o.method();}}


6.匿名内部类:
  前提条件:
  有一个类或者接口存在:
  这个类可以是具体类也可以是抽象类
interface Inter4{public abstract void show();public abstract void show2();}class Outer4{public void method(){Inter4 i = new Inter4(){@Overridepublic void show() {System.out.println("show Inter");}@Overridepublic void show2() {System.out.println("show2 Inter");}};i.show();i.show2();}}public class Demo4 {public static void main(String[] args) {Outer4 o = new Outer4();o.method();}}


  
  格式:
  new 类名/接口名(){
  方法重写;
  } ;
  
  匿名内部类的本质:
  需要继承该类或者实现该接口的子类对象!
  
  内部类与外部类直接没有继承关系!


7.
interface Person{public abstract void study();}class PersonDemo{public void method(Person p){//此处传递的不是接口,而是接口的子实现类对象p.study();}}//实现类class Student implements Person{@Overridepublic void study() {System.out.println("好好学习,天天向上....");}}//测试类public class InnerTest {public static void main(String[] args) {//需求:调用PersonDemo中的method方法PersonDemo sd = new PersonDemo() ;//接口多态Person p = new Student();sd.method(p);System.out.println("--------------");//匿名内部类的使用PersonDemo pd = new PersonDemo() ;pd.method(new Person() {@Overridepublic void study() {System.out.println("好好学习,天天向上");}});}}


8.
输出 30 20 10

class Outer8{public int num = 10 ;//成员内部类class Inner8{public int num = 20 ;public void method(){int num = 30 ;System.out.println(num);System.out.println(this.num); //代表当前类的对象:Inner8类中//System.out.println(new Outer8().num);//使用匿名对象的方式去访问numSystem.out.println(Outer8.this.num);//使用外部累名.this去调用成员变量(外部类限定this)}}}//测试类public class InnerTest2 {public static void main(String[] args) {//成员内部类访问自己内部成员//外部类名.内部类名 对象名 =外部对象.内部类对象 ;Outer8.Inner8 oi = new Outer8().new Inner8();oi.method();}}



 
原创粉丝点击