类中定义内部类
内部类可声明成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