1、Java中的内部类都有什么?!
2、内部类详解
•成员内部类
在一个类的内部再创建一个类,成为内部类
1)在一个类中使用内部类,可以在内部类中直接存取所在类的私有属性或方法 1 class Outer{ 2 //外部类Outer 3 private int i = 111 ;//外部类私有变量 4 class Inner{ 5 //内部类Inner 6 private int j = 222 ;//内部类私有变量 7 public void print(){ 8 System.out.println("外部类的私有属性"+ i); 9 System.out.println("内部类的私有属性"+ j);10 }11 }12 }13 public class ClassDemo5 {14 public static void main(String[] args) {15 Outer o = new Outer() ;16 Outer.Inner i = o.new Inner() ; 17 i.print() ;18 }19 }
2)内部类的实例化方法import 面向对象基础.Outer.Inner;
//第一种方式:导入import 面向对象基础.Outer.Inner;包Outer.Inner i = o.new Inner() ; //第二种方式:外部类.内部类 对象名 = 外部类对象.new 内部类
3)外部类访问内部类1 class Fatch{
2 //外部类Fatch
3 public class Student{
4 //内部类Student
5 public void show(){
6 //内部类show()方法
7 System.out.println("内部类Student的show()方法");
8 }
9 }
10 public void print(){
11 /**
12 * 外部类不可以直接访问内部类的属性或方法,
13 * 必须创建内部类对象才可以访问
14 */
15 new Student().show() ; //使用匿名对象实例化调用内部类的类成员
16 System.out.println("外部类Fatch的print()方法");
17 }
18 }
19 public class ClassDemo4 {
20 public static void main(String[] args) {
21 Fatch f = new Fatch() ; //实例化外部类对象
22 f.print() ; //调用外部类的print()方法
23 }
24 }
4)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。1 class Outer1 {
2 //外部类
3 private int i = 10 ;//外部类私有变量
4 class Inner1{
5 //内部类
6 private int i = 20 ;//内部类私有变量
7 public void show(){
8 //内部类方法
9 System.out.println("内部类的变量"+ this.i );//使用this关键字访问内部类成员
10 System.out.println("外部类的变量"+ Outer1.this.i);//使用外部类名.this.变量名 来访问外部类成员
11 }
12 }
13 public void print(){
14 new Inner1().show() ; //调用内部类方法
15 }
16 }
17 public class ClassDemo6 {
18 public static void main(String[] args) {
19 new Outer1().print() ;
20 }
21
22 }
•注意点: »实例化内部类之前必须实例化外部类 »内部类可以随意访问他的外部类成员,但外部类不可以直接访问内部类的类成员 »内部类可以被声明为private 或 protected 权限的访问 »内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象 •局部内部类(方法内部类) 内部类不仅可以在类中进行定义,也可以在类的局部位置进行定义,例如在类的方法或者任意的作用域中都可以定义内部类
1)在外部类的方法中定义一个方法内部类 1 class Demo1{ 2 //外部类Demo 3final int I = 10 ;//外部类定义的常量 4public void show(){//外部类的show()方法 5class Inne{//方法内部类 6int j = 20 ;//方法内部类变量 7private void inshow() {//方法内部类中的inshow()方法 8System.out.println("外部类常量"+ I ); 9System.out.println("方法内部类变量"+ j );10 }11}12Inne in = new Inne();//实例化内部类对象13in.inshow() ;//调用内部类方法14}15 }16 public class ClassDemo7 {17 public static void main(String[] args) {18 Demo1 d = new Demo1() ;19 d.show() ;20 }21 } 注意:如果方法中的参数需要被传递进去,就必须把参数声明成final类型
•静态内部类
如果一个内部类被声明为static,此内部类就称为外部类
1)静态内部类可以通过(new 外部类名.内部类.内部类方法名) ,来调用静态内部类方法 1 class Outer2{ 2 //外部类 3 private static String str = "张博杰" ;//外部类的静态变量 4 static class Inner2{ 5 //使用static声明 的静态内部类 6 public void fun() { 7 //静态内部类方法 8 System.out.println("外部类的静态变量"+" "+ str); 9 }10 }11 }12 public class ClassDemo8 {13 public static void main(String[] args) {14 new Outer2.Inner2().fun() ;15 //静态内部类可以使用new 外部类名.内部类.内部类方法名 ,来调用静态内部类方法16 }17 }
•匿名内部类
匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写.使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
1)匿名内部类的实现 1 abstract class A2 {//抽象类A2 2 public abstract void eat() ; 3 } 4 public class ClassDemo9 { 5 public static void main(String[] args) { 6 /** 7* 如果A2这个抽象类只用一次,那么就可一使用匿名内部类来实现 8*/ 9 A2 a = new A2(){10 public void eat(){11 System.out.println("我要吃饭");12 }13 } ;14 a.eat() ;15 }16 }
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139542.htm