如果一个类要被声明为static的,只有一种情况,就是静态内部类。如果在外部类声明为static,程序会编译都不会过。在一番调查后个人总结出了3点关于内部类和静态内部类(俗称:内嵌类)
1.普通内部类:注意调用的方法【外部类不能是抽象类和接口】
//外部类 class Out { private int age = 12; //内部类 class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out().new In(); in.print(); } }
2.匿名内部类:注意结构======>注意 这个父类构造器可以是 抽象类
new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }
匿名内部类调用两种方式
package lianxi; public class Lianxi { public static void main(String[] args) { /*====>这种构造方法可以实现父类中没有的方法实现调用 * new Dongwu() { public void xiuxi() { System.out.println("看看这个地方"); }; public void xiuxi1() { System.out.println("看看这个那地方"); }; }.xiuxi1();*/ Dongwu d = new Dongwu() { //这种方法只能对外类的方法进行重写 不然调用的时候会报错 public void xiuxi() { System.out.println("看看这个地方"); }; }; d.xiuxi(); } } abstract class Dongwu{ public static int age = 10; public void chi() { System.out.println("吃肉"); } abstract void xiuxi(); } class Dog extends Dongwu{ public void xiuxi() { System.out.println("娱乐项目"+Dongwu.age); } public void wan() { System.out.println("娱乐玩项目"+Dongwu.age); } }
3.静态内部类=====>注意调用方法
class Out { private static int age = 12; static class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out.In(); in.print(); } }
4.方法内部类(局部内部类)====》了解 就可 据说不常用
方法内部类 中不能用限制符修饰(如 public)
class Out { private int age = 12; public void Print(final int x) { class In { public void inPrint() { System.out.println(x); System.out.println(age); } } new In().inPrint(); } } public class Demo { public static void main(String[] args) { Out out = new Out(); out.Print(3); } }
5.
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法
如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义
至于final在这里并没有特殊含义,只是一种表示形式而已【这个地方我没遇到过,以后遇到再说【自己测试过几次反正不用final】】
6.内部内传值同样是给内部类定义一个方法 间接改变其他参数
new ActionListener(){ private String innerStr; @Override public void actionPerformed(ActionEvent arg0) { jl.setText(innerStr); } public ActionListener accept(String str) { this.innerStr = str; return this; } }.accept(innerString);