27 内部类

方法内部类,成员内部类,静态内部类,匿名内部类

1.方法内部类

public class Person{
    
    public static void main(String[] args){
        //调用内部内对象就是先---外部类对象.方法();在方法中创建内部类对象,并且通过内部类对象来调用内部类属性和方法
        
     new out().m();
    }
}
class out{
    int b=0;
    public void n() {
        final int k2=10;
        m(); //n中调用m方法
    }
    public void m() {
        int k=10;//在jdk1.7及其以前要显式的去表示这个是常量(要加上final),就是显式常量
        //jdk1.8新特性及其以后就是隐式常量(只要定义一个变量就是常量),在方法内部类中去用的时候就是常量
        //方法内部类
        /**1.只能定义非静态的属性和方法
         * 2.final也可以修饰方法和属性
         * 3.可以定义静态常量(static final)
         * 4.可以能到外部类所有的属性和方法
         * 5.可以拿到包含此内部类方法里的常量,声明的变量在此时也会隐式的转换成常量(加上了final)
         *6.可以继承其他类和实现接口
         *7.内部类前不允许加访问修饰符 ,只能加final或者abstract(抽象)我们就无法访问到 
         *8.如何创建内部类的对象? 不能再其他方法中创建内部类对象,只能在本方法内创建
         *9.别的方法中调用内部内对象就是先---外部类对象.方法();在方法中创建内部类对象,并且通过内部类对象来调用内部类属性和方法
         */
        
          class Inner1 extends Object {
            static final int a=2;

            void m2() {
                //可以拿到外部类的属性方法 
                System.out.println(b);
                //
                //可以拿到方法中的常量
                System.out.println(k);
                //  k=11;//这里报错了因为k是一个隐式常量,值不能被修改
                //不能拿到不包含此内部类方法 的常量
                //System.out.println(k2);
          
            }//endm2()

        }//end内部类
          //创建内部类对象
          Inner1 nei=new Inner1();
          nei.m2(); //调用内部类中的方法
    }//endm()
}//endout类

 2.成员内部类

public class Person{
    
    public static void main(String[] args){
        //创建成员内部类的对象
        Out.Inner1 in1=new Out().new Inner1();
    }
}

//外部类
 class Out{
    //属性 -----成员变量
    int i=1;
    /**
     * 位置在类内方法外
     * 1.只能定义非静态属性和方法
     * 2.可以修饰静态常量(static final)和常量
     * 3.可以拿到外部类所有的属性和方法
     * 4.和方法内部类的很大区别是可以被访问修饰符修饰
     * 5.可以继承和多实现
     * 6.如何产生对象?  通过外部类找到内部类然后声明对象就好
     */
    //成员内部类
    public class Inner1 extends Object implements Cloneable{
        //属性
         int j=2;
        //方法
        public void n() {
            
        }
        
    }//endInner1
    //方法----成员方法
    public void m() {
            
    }
}//endout类

 3.静态内部类

public class Person{
    
    public static void main(String[] args){

        System.out.println(Out.Inner1.j);//访问静态内部类中的静态属性
        //创建静态内部类的对象
        Out.Inner1 in=new Out.Inner1();
    }
}

//外部类
 class Out{
    //属性 -----成员变量
    static int i=1;
    /**
     * 位置在类内方法外
     * 1.可以定义任意的属性和方法(静态和非静态都可以)以及静态常量
     * 2.只能拿到外部内的静态属性和方法;
     * 3.可以被访问权限修饰符修饰和final和abstract
     * 4.可以继承和多实现
     * 5.如何产生对象?  通过外部类点出静态内部类然后创建内部类对象
     */
    //静态内部类
    static class Inner1 extends Object implements Cloneable{
        //属性
        static int j=2;
        int i=3;
        //方法
        public void n() {
            System.out.println(i);
        }
        
    }//endInner1
    //方法----成员方法
    public void m() {
            
    }
}//endout类

4.匿名内部类---实质继承或者实现,最终要进行方法重写。

public class Person{
 C c=new C() {//成员位置下的匿名内部类
     
 };
    public static void main(String[] args){
        /**
         * 匿名内部类
         * 1.{}匿名内部类的内容 {}相当于匿名内部类
         * 2.匿名内部类在重写重写抽象方法
         * 3.匿名内部类就是在继承类(抽象类和普通类 )
         * 4.一个类或者接口可以被继承或者实现,那么这个类或者接口就会有匿名内部类的形式
         * 5.构造函数私有化也可以被继承
         * 6.创建一次对象,创建一个匿名内部类麻烦
         * 7.如果匿名内部类在方法中定义中,就和方法内部类使用一致
         * 8.如果匿名内部类在成员的位置定义就和成员内部类使用一致
         */
        D d=new D() {

            @Override
            void m() {
                // TODO 自动生成的方法存根

            }
        };
        C c=new C() { //普通类也能有匿名内部类
            
        };
    /*B b=new B() { //final修饰的不能被继承的类没有匿名内部类
            
        };*/
    A a=new A() { //接口也能有匿名内部类
            
        };
    }
}
interface A{
    
}
final class B{
    
}
class C{
    
}
class E{
    //私有构造,感觉不能被继承,但是可以通过内部类访问
    private E () {
        
    }
    class E2 extends E{
        //通过E2成员内部类访问
    }
}
abstract class D{
    abstract void m();
}
public class Person{

    public static void main(String[] args){
        int j=10;
        A2 a=new A2() { //这个a不是接口的对象是匿名内部类的对象
            int i=10;
            @Override
            public void m() {
                //j=20;  //报错,此时的匿名内部类相当于方法内部类,使用方法中的变量的时候是隐式的添加了final
                //不可改变
                System.out.println(j);
                // TODO Auto-generated method stub

            }
        };
        a.m();
    }
}

interface A2{
    void m();
}

 

 接口中的内部类 默认用static 修饰

内部接口 :接口中来个接口,类中再来个接口(再来个接口默认是静态的) 详情请看:https://www.cnblogs.com/chenpi/p/5518400.html

 

posted @ 2019-06-29 09:55  三十六烦恼风x  阅读(149)  评论(0编辑  收藏  举报