java内部类的学习笔记-总结-考试

内部类大致分五种情况:静态成员类(static member class),成员类(member class),静态局部类(static local class),局部类(local class),匿名类(anonymous class),下面我一一实例讲解:
package com.fruitking.innerclass;
/**
* 静态成员类:类声明中包含"static"关键字的内部类。
* 静态成员类有public/private/default权限修饰符。
* 静态成员类的使用方式与一般顶层类的使用方式基本相同。
* 静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
* 外部类的静态成员属性、静态方法可以供内部类直接调用。
* 外部类的非静态成员属性、非静态方法不能被内部类调用(没有实例引用)。
* 内部类的静态成员属性、静态方法可以供外部类调用(内部类前缀加调用属性名称或方法名称)。
* 内部类的非静态成员属性、非静态方法需要实例化一个内部类才能被这个内部类实例所调用。
*/
public class TestStaticInnerClass {
private static String OUTCLASS_STATIC_VARIABLE_NAME = "OUTCLASS_STATIC_VARIABLE_NAME";
public String outVariableName = "out Variable Name";
private static String outStaticMethod(){
System.out.println("Out class static method!");
return "invoke out class' outStaticMethod()";
}
private static String innerStaticMethodByOutStaticMethod(){
System.out.println("Out Static Method invoke inner Static Method!");
return StaticInnerClass.innerStaticMethod();
}
private static String innerNonStaticMethodByOutStaticMethod(){
System.out.println("Out Static Method invoke inner not Static Method!");
System.out.println(new StaticInnerClass().innerVariableName);
return new StaticInnerClass().innerNonStaticMethod();
}
public static class StaticInnerClass{
public static String INNERCLASS_STATIC_VARIABLE_NAME = "INNERCLASS_STATIC_VARIABLE_NAME";
public static String INNERCLASS_OUT_STATIC_VARIABLE_NAME = OUTCLASS_STATIC_VARIABLE_NAME;
public String innerVariableName = "inner Variable Name";
public String innerNonStaticMethod(){
//compile error:Cannot make a static reference to the non-static field outVariableName
//System.out.println(outVariableName);
System.out.println("inner not-static method!");
return "invoke inner class not-static method!";
}
public static String innerStaticMethod(){
System.out.println("inner class method!");
return "return inner class name";
}
public static String outStaticMethodByInnerStaticMethod(){
System.out.println("Inner Static Method invoke out Static Method!");
return outStaticMethod();
}
}
public static void main(String[] args) {
System.out.println(TestStaticInnerClass.innerStaticMethodByOutStaticMethod());
System.out.println(TestStaticInnerClass.innerNonStaticMethodByOutStaticMethod());
System.out.println(TestStaticInnerClass.StaticInnerClass.INNERCLASS_STATIC_VARIABLE_NAME);
System.out.println(TestStaticInnerClass.StaticInnerClass.INNERCLASS_OUT_STATIC_VARIABLE_NAME);
System.out.println(TestStaticInnerClass.StaticInnerClass.innerStaticMethod());
System.out.println(TestStaticInnerClass.StaticInnerClass.outStaticMethodByInnerStaticMethod());
StaticInnerClass inner = new TestStaticInnerClass.StaticInnerClass();
System.out.println(inner.innerVariableName);
System.out.println(inner.innerNonStaticMethod());
}
}
package com.fruitking.innerclass;

/**
* 一个静态成员类,若去掉"static"关键字,就成为成员类。
* 类似于外部类的实例函数,成员类有public/private/default权限修饰符.
* 一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。
* 不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。
* 成员类不能是接口(interface)。
*/
public class TestNonStaticInnerClass {
private static String OUTCLASS_STATIC_VARIABLE_NAME = "OUTCLASS_STATIC_VARIABLE_NAME";
public String outVariableName = "out Variable Name";
private String sameVariableName = "out Variable Name";
private static String outStaticMethod(){
System.out.println("Out class static method!");
return "invoke out class' outStaticMethod()";
}
private String outNotStaticMethod(){
System.out.println("Out class non-static method!");
return "invoke out class' outNotStaticMethod()";
}
private String outNonStaticMethodByInnerClass(){
System.out.println("Out class non-static method!");
//一下两行代码是等价的
StaticInnerClass innerClass = TestNonStaticInnerClass.this.new StaticInnerClass();
innerClass = this.new StaticInnerClass();
System.out.println("inner Variable INNERCLASS_STATIC_FINAL_VARIABLE_NAME:" + StaticInnerClass.INNERCLASS_STATIC_FINAL_VARIABLE_NAME);
System.out.println("inner Variable innerVariableName:" + innerClass.innerVariableName);
System.out.println("inner Variable sameVariableName:" + innerClass.sameVariableName);
System.out.println("invoke inner class non-static method'innerNonStaticMethod:" + innerClass.innerNonStaticMethod());
System.out.println("invoke inner class non-static private method'innerNonStaticPrivateMethod:" + innerClass.innerNonStaticPrivateMethod());
return "invoke out class' outStaticMethod()";
}
private static String outStaticMethodByInnerClass(){
System.out.println("Out class non-static method!");
//静态外部方法不能调用非静态内部类,this不能这么使用
//System.out.println("invoke inner class non-static method'innerNonStaticMethod:" + this.new StaticInnerClass().innerNonStaticMethod());
//那么先new一个外部类,然后在new内部类,这样可以使用,但使用意义估计不大
TestNonStaticInnerClass outClass = new TestNonStaticInnerClass();
StaticInnerClass innerClass = outClass.new StaticInnerClass();
System.out.println("inner Variable innerVariableName:" + innerClass.innerVariableName);
System.out.println("inner Variable sameVariableName:" + innerClass.sameVariableName);
System.out.println("invoke inner class non-static method'innerNonStaticMethod:" + innerClass.innerNonStaticMethod());
System.out.println("invoke inner class non-static private method'innerNonStaticPrivateMethod:" + innerClass.innerNonStaticPrivateMethod());
return "invoke out class' outStaticMethod()";
}
public class StaticInnerClass{
//compile error:The field INNERCLASS_STATIC_VARIABLE_NAME cannot be declared static;
//static fields can only be declared in static or top level types
//public static String INNERCLASS_STATIC_VARIABLE_NAME = "INNERCLASS_STATIC_VARIABLE_NAME";
//compile error:The method innerStaticMethod cannot be declared static;
//static methods can only be declared in a static or top level type
//public static String innerStaticMethod(){
// return "";
//}
public static final String INNERCLASS_STATIC_FINAL_VARIABLE_NAME = "INNERCLASS_STATIC_FINAL_VARIABLE_NAME";
public String innerVariableName = "inner Variable Name";
public String innerVariableOutName = outVariableName;
public String sameVariableName = "inner Variable Name";
public String innerNonStaticMethod(){
System.out.println("inner not-static method!");
System.out.println("out Variable OUTCLASS_STATIC_VARIABLE_NAME:" + OUTCLASS_STATIC_VARIABLE_NAME);
System.out.println("out Variable outVariableName:" + outVariableName);
System.out.println("out Variable sameVariableName:" + TestNonStaticInnerClass.this.sameVariableName);
System.out.println("invoke out class static method'outStaticMethod:" + outStaticMethod());
System.out.println("invoke out class non-static method'outNotStaticMethod:" + outNotStaticMethod());
System.out.println("inner Variable INNERCLASS_STATIC_FINAL_VARIABLE_NAME:" + INNERCLASS_STATIC_FINAL_VARIABLE_NAME);
System.out.println("inner Variable innerVariableName:" + innerVariableName);
System.out.println("inner Variable sameVariableName:" + sameVariableName);
System.out.println("inner Variable this.sameVariableName:" + this.sameVariableName);
System.out.println("invoke inner class non-static private method'innerNonStaticPrivateMethod:" + innerNonStaticPrivateMethod());
return "invoke inner class not-static method!";
}
private String innerNonStaticPrivateMethod(){
System.out.println("inner Variable innerVariableName:" + innerVariableName);
System.out.println("inner Variable sameVariableName:" + sameVariableName);
return "invoke inner class not-static private method!";
}
}
public static void main(String[] args) {
System.out.println(TestNonStaticInnerClass.outStaticMethodByInnerClass());
System.out.println(new TestNonStaticInnerClass().outNonStaticMethodByInnerClass());
}
}
package com.fruitking.innerclass;

/**
* 对一个静态成员类,去掉其声明中的"static"关键字,
* 将其定义移入其外部类的静态方法或静态初始化代码段中就成为了局部静态成员类。
* 局部静态成员类与静态成员类的基本特性相同。
* 局部类能且只能访问其所属代码段中的声明为final的局部变量。
* 局部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)
*/
public class TestStaticLocalInnerClass {
private static String OUTCLASS_STATIC_VARIABLE_NAME = "OUTCLASS_STATIC_VARIABLE_NAME";
public String outVariableName = "out Variable Name";
private static String outStaticMethod(){
System.out.println("Out class static method!");
return "invoke out class' outStaticMethod()";
}
private static String innerStaticMethodByOutStaticMethod(){
System.out.println("Out Static Method invoke inner Static Method!");
String outMethodVariable = "outMethodVariable";
final String outMethodFinalVariable = "outMethodFinalVariable";
class StaticInnerClass{
public final static String INNERCLASS_STATIC_VARIABLE_NAME = "INNERCLASS_STATIC_VARIABLE_NAME";
//The field INNERCLASS_OUT_STATIC_VARIABLE_NAME cannot be declared static; static
// fields can only be declared in static or top level types
//public static String INNERCLASS_OUT_STATIC_VARIABLE_NAME = "INNERCLASS_OUT_STATIC_VARIABLE_NAME";
public String innerVariableName = "inner Variable Name";
public String innerNonStaticMethod(){
System.out.println("inner not-static method!");
System.out.println("out Variable OUTCLASS_STATIC_VARIABLE_NAME:" + OUTCLASS_STATIC_VARIABLE_NAME);
//compile error:Cannot make a static reference to the non-static field outVariableName
//System.out.println("out Variable outVariableName:" + outVariableName);
//Cannot refer to a non-final variable outMethodVariable inside an inner class
//defined in a different method
//System.out.println("out method Variable outMethodVariable:" + outMethodVariable);
System.out.println("out method Variable outMethodFinalVariable:" + outMethodFinalVariable);
System.out.println("invoke out class static method'outStaticMethod:" + outStaticMethod());
System.out.println("inner Variable INNERCLASS_STATIC_VARIABLE_NAME:" + INNERCLASS_STATIC_VARIABLE_NAME);
System.out.println("inner Variable innerVariableName:" + innerVariableName);
System.out.println("invoke inner class static method'outStaticMethodByInnerStaticMethod:" + outStaticMethodByInnerStaticMethod());
return "invoke inner class not-static method!";
}
//The method innerStaticMethod cannot be declared static; static methods can only
//be declared in a static or top level type
//public static String innerStaticMethod(){
// System.out.println("inner class method!");
// return "return inner class name";
//}
public String outStaticMethodByInnerStaticMethod(){
System.out.println("Inner Static Method invoke out Static Method!");
return outStaticMethod();
}
}
System.out.println("inner Variable INNERCLASS_STATIC_VARIABLE_NAME:" + StaticInnerClass.INNERCLASS_STATIC_VARIABLE_NAME);
//Cannot make a static reference to the non-static field
// StaticInnerClass.innerVariableName
//System.out.println("inner Variable innerVariableName:" + StaticInnerClass.innerVariableName);
System.out.println("invoke inner class static method'innerNonStaticMethod:" + new StaticInnerClass().innerNonStaticMethod());
System.out.println("invoke inner class static method'outStaticMethodByInnerStaticMethod:" + new StaticInnerClass().outStaticMethodByInnerStaticMethod());
return "invokeOut Static Method!";
}
public static void main(String[] args) {
System.out.println(TestStaticLocalInnerClass.innerStaticMethodByOutStaticMethod());
}
}
package com.fruitking.innerclass;

/**
* 对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。
* 局部成员类与成员类的基本特性相同。
* 局部类能且只能访问其所属代码段中的声明为final的局部变量。
* 局部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)
*/
public class TestNonStaticLocalInnerClass {
private static String OUTCLASS_STATIC_VARIABLE_NAME = "OUTCLASS_STATIC_VARIABLE_NAME";
public String outVariableName = "out Variable Name";
private String sameVariableName = "out Variable Name";
private static String outStaticMethod(){
System.out.println("Out class static method!");
return "invoke out class' outStaticMethod()";
}
private String outNotStaticMethod(){
System.out.println("Out class non-static method!");
return "invoke out class' outNotStaticMethod()";
}
private String outNonStaticMethodByInnerClass(){
System.out.println("Out class non-static method!");
String outMethodVariable = "outMethodVariable";
final String outMethodFinalVariable = "outMethodFinalVariable";
class StaticInnerClass{
public static final String INNERCLASS_STATIC_FINAL_VARIABLE_NAME = "INNERCLASS_STATIC_FINAL_VARIABLE_NAME";
public String innerVariableName = "inner Variable Name";
public String innerVariableOutName = outVariableName;
public String sameVariableName = "inner Variable Name";
public String innerNonStaticMethod(){
System.out.println("inner not-static method!");
//Cannot refer to a non-final variable outMethodVariable inside an inner class
//defined in a different method
//System.out.println("out method Variable outMethodVariable:" + outMethodVariable);
System.out.println("out method Variable outMethodFinalVariable:" + outMethodFinalVariable);
System.out.println("out Variable OUTCLASS_STATIC_VARIABLE_NAME:" + OUTCLASS_STATIC_VARIABLE_NAME);
System.out.println("out Variable outVariableName:" + outVariableName);
System.out.println("out Variable sameVariableName:" + TestNonStaticLocalInnerClass.this.sameVariableName);
System.out.println("invoke out class static method'outStaticMethod:" + outStaticMethod());
System.out.println("invoke out class non-static method'outNotStaticMethod:" + outNotStaticMethod());
System.out.println("inner Variable INNERCLASS_STATIC_FINAL_VARIABLE_NAME:" + INNERCLASS_STATIC_FINAL_VARIABLE_NAME);
System.out.println("inner Variable innerVariableName:" + innerVariableName);
System.out.println("inner Variable sameVariableName:" + sameVariableName);
System.out.println("inner Variable this.sameVariableName:" + this.sameVariableName);
System.out.println("invoke inner class non-static private method'innerNonStaticPrivateMethod:" + innerNonStaticPrivateMethod());
return "invoke inner class not-static method!";
}
private String innerNonStaticPrivateMethod(){
System.out.println("inner Variable innerVariableName:" + innerVariableName);
System.out.println("inner Variable sameVariableName:" + sameVariableName);
return "invoke inner class not-static private method!";
}
}
//一下两行代码是等价的
StaticInnerClass innerClass = new StaticInnerClass();
System.out.println("inner Variable INNERCLASS_STATIC_FINAL_VARIABLE_NAME:" + StaticInnerClass.INNERCLASS_STATIC_FINAL_VARIABLE_NAME);
System.out.println("inner Variable innerVariableName:" + innerClass.innerVariableName);
System.out.println("inner Variable sameVariableName:" + innerClass.sameVariableName);
System.out.println("invoke inner class non-static method'innerNonStaticMethod:" + innerClass.innerNonStaticMethod());
System.out.println("invoke inner class non-static private method'innerNonStaticPrivateMethod:" + innerClass.innerNonStaticPrivateMethod());
return "invoke out class' outStaticMethod()";
}
public static void main(String[] args) {
System.out.println(new TestNonStaticLocalInnerClass().outNonStaticMethodByInnerClass());
}
}
package com.fruitking.innerclass;
/**
* 没有类名的局部类就是匿名类。
* 用一条语句完成匿名类的定义与实例创建。
*/
public class TestAnonymousClass {
public void instanceMethod() {
//define a nonymous class which implements Action interface and creat an instance of it
Action action = new Action() {
public void doAction() {
System.out.println("a simple anonymous class demo");
}};
action.doAction();
//define a nonoymous class which extends BaseClass and create an instance of it
new AnonymousClass(5){
public void printData(){
System.out.println("data = " + getData());
}
}.printData(); //"data = 5" will be outputed
}
public static void main(String[] args) {
new TestAnonymousClass().instanceMethod();
}
}
interface Action {
void doAction();
}
class AnonymousClass {
private int data;
public AnonymousClass(int data) {
this.data = data;
}
public int getData() {
return data;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值