java内部类


类中定义内部类

内部类可声明成public或private。当内部类声明成public或private时,对其访问的限制与成员变量和成员方法完全相同。

外部类是无法找到内部类中所声明的属性。而内部类则可以访问外部类的属性。
内部类可以直接使用外部类的成员变量,用static也可以声明内部类,用static声明的内部类则变成外部类,但是用static声明的内部类不能访问非static的外部类属性。
外部类不能直接试用内部类的成员变量,需要试用对象的方式访问
内部类也可以通过创建对象从外部类之外被调用,只要将内部类声明为public即可

内部类不仅可以在类中定义,也可以在方法中定义内部类。
在方法中定义的内部类只能访问方法中的final类型的局部变量

==========================================================================================================================================
内部类则可以访问外部类的属性。
class Outer {
 int score = 95;

 void inst() {
  Inner in = new Inner();
  in.display();
 }

 class Inner {
  void display() {
   System.out.println("成绩: score = " + score);
  }
 }
}

public class InnerClassDemo {
 public static void main(String[] args) {
  Outer outer = new Outer();
  outer.inst();
 }
}
输出结果:
成绩: score = 95


==========================================================================================================================================

外部类不能直接试用内部类的成员变量,需要试用对象的方式访问
下列编译错误
编译结果:
InnerClassDemo1.java:21: cannot resolve symbol
symbol : variable name
location: class Outer1

class Outer1 {
 int score = 95;

 void inst() {
  Inner in = new Inner();
  in.display();
 }

 public class Inner {
  void display() {
   // 在内部类中声明一name属性
   String name = "张三";
   System.out.println("成绩: score = " + score);
  }
 }

 public void print() {
  // 在此调用内部类的name属性
  System.out.println("姓名:" + name);
 }
}

public class InnerClassDemo1 {
 public static void main(String[] args) {
  Outer1 outer = new Outer1();
  outer.inst();
 }
}


================================================================static==========================================================================
用static也可以声明内部类,用static声明的内部类则变成外部类,但是用static声明的内部类不能访问非static的外部类属性。

下列编译错误
编译结果:
InnerClassDemo2.java:14: non-static variable score cannot be referenced from a static context
System.out.println("成绩: score = " + score);


class Outer2 {
 int score = 95;

 void inst() {
  Inner in = new Inner();
  in.display();
 }

 // 这里用static声明内部类
 static class Inner {
  void display() {
   System.out.println("成绩: score = " + score);
  }
 }
}

public class InnerClassDemo2 {
 public static void main(String[] args) {
  Outer2 outer = new Outer2();
  outer.inst();
 }
}

 

class Outer2 {
 // 这里用static声明外部类变量
 static int score = 95;

 void inst() {
  Inner in = new Inner();
  in.display();
 }

 // 这里用static声明内部类
 static class Inner {
  void display() {
   System.out.println("成绩: score = " + score);
  }
 }
}

public class InnerClassDemo2 {
 public static void main(String[] args) {
  Outer2 outer = new Outer2();
  outer.inst();
 }
}
输出结果:
成绩: score = 95

 

================================================================public==========================================================================
内部类也可以通过创建对象从外部类之外被调用,只要将内部类声明为public即可
class Outer3 {
 int score = 95;

 void inst()

 {
  Inner in = new Inner();
  in.display();
 }

 public class Inner {
  void display() {
   System.out.println("成绩: score = " + score);
  }
 }
}

public class InnerClassDemo3 {
 public static void main(String[] args) {
  Outer3 outer = new Outer3();
  Outer3.Inner inner = outer.new Inner();
  inner.display();
 }
}
输出结果:
成绩: score = 95

================================================================在方法中定义内部类==========================================================================
在方法中定义内部类
class Outer4 {
 int score = 95;

 void inst() {
  class Inner {
   void display() {
    System.out.println("成绩: score = " + score);
   }
  }
  Inner in = new Inner();
  in.display();
 }
}

public class InnerClassDemo4 {
 public static void main(String[] args) {
  Outer4 outer = new Outer4();
  outer.inst();
 }
}
输出结果:
成绩: score = 95


================================================================在方法中定义内部类==========================================================================
class Outer4 {
 int score = 95;

 void inst() {
  class Inner {
   void display() {
    System.out.println("成绩: score = " + score);
   }
  }
  Inner in = new Inner();
  in.display();
 }
}

public class InnerClassDemo4 {
 public static void main(String[] args) {
  Outer4 outer = new Outer4();
  outer.inst();
 }
}
输出结果:
成绩: score = 95


==================================================================final类型的局部变量========================================================================

在方法中定义的内部类只能访问方法中的final类型的局部变量
class Outer5 {
 int score = 95;

 void inst(final int s) {
  int temp = 20;
  class Inner {
   void display() {
    System.out.println("成绩: score = " + (score + s + temp));
   }
  }
  Inner in = new Inner();
  in.display();
 }
}

public class InnerClassDemo5 {
 public static void main(String[] args) {
  Outer5 outer = new Outer5();
  outer.inst(5);
 }
}
编译结果:
InnerClassDemo5.java:11: local variable temp is accessed from within inner class; needs to be declared final

class Outer5 {
 int score = 95;

 void inst(final int s) {
  final int temp = 20;
  class Inner {
   void display() {
    System.out.println("成绩: score = " + (score + s + temp));
   }
  }
  Inner in = new Inner();
  in.display();
 }
}

public class InnerClassDemo5 {
 public static void main(String[] args) {
  Outer5 outer = new Outer5();
  outer.inst(5);
 }
}
输出结果:
成绩: score = 120

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值