java类 (二):内部类

时间:2021-05-15 15:46:17

如果一个类要被声明为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);