Posted etherovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类相关的知识,希望对你有一定的参考价值。

C++11

7.1 定义抽象数据类型

7.2 访问控制与封装

7.3 类的其他特性

7.4 构造函数再探

7.5 类的静态成员

JavaSE基础(十 三 )---<内部类>成员内部类,静态内部类,局部内部类,匿名内部类,内部类的意义


内部类


1.什么是内部类


定义在一个类中的类就是内部类


在一个java文件中;允许出现一个public class 类;但是可以写多个class类;但是这几个类没有包含在定义的那个类中时,这样的类就不是内部类;
例如这个Outer1类就不是内部类;而Inner是内部类.

//外部类
public class Outer {
    
    //定义在一个类中的类;即内部类
    class Inner{
        
    }
}
//这个类与外部类同等级的;也算是外部类;
class  Outer1{

}

内部类创建执行后
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。


2.分类


成员内部类


成员内部类就是在定义在外部类中的,和外部类的成员属性以及成员方法一个级别的内部类(可以说是位于外部类成员位置的类);在成员内部类中可以调用外部类的属性或方法,甚至是私有访问修饰权限的属性,方法.

//外部类
public class Outer {
    //外部类的成员属性;
    int number0=10;
    //外部类的私有属性;
    private int number1=15;
    //外部类的方法;
    public void OutTest(){
        System.out.println("外部类的方法");
    }
    //成员内部类Inner;
    class Inner{
        //在内部类可以写内部类自己的方法;
        public void InTest(){
            System.out.println("内部类的方法");
            //内部类可以获取外部类的属性;甚至是私有修饰的;
            System.out.println(number0);
            System.out.println(number1);
            //内部类调用外部类方法;
            OutTest();
        }
    }
}

测试类:

//测试类;
public class Test {
    public static void main(String[] args) {
        //创建成员内部类对象;
        Outer.Inner inside=new Outer().new Inner();
        //使用内部类方法;
        inside.InTest();
    }
}

在这里插入图片描述


私有修饰权限的内部类


如果说,定义的内部类并不想直接被外界访问时,(就类似于之前的封装学习中,在类中封装一些特定功能);可以将定义的内部类用private私有权限修饰符声明;这时外界就不能直接地通过创建内部类对象的方式直接访问了

外界如何访问呢,可以在包含该内部类的外部类中定义一个封装了创建内部类对象的方法去获取内部类;提供给外界这样一个方法去访问封装的内部类.


//外部类
public class Outer {
    //在外部类中定义一个可以获取内部类的方法;
    public void getInner(){
        //创建内部类的对象;
        Inner inner=new Inner();
        //调用内部类的方法;
        inner.InTest();
    }
    //成员内部类Inner;
    private class Inner{
        //在内部类可以写内部类自己的方法;
        public void InTest(){
            System.out.println("内部类的方法");
        }
    }
}

测试类:

//测试类;
public class Test {
    public static void main(String[] args) {
       //创建外部类的对象
        Outer outer=new Outer();
        //外界获取内部类;
        outer.getInner();
    }
}

在这里插入图片描述


静态内部类


被static修饰的成员内部类;唯一不同点就是静态内部类不能使用外部类的非静态属性和方法.

//外部类
public class Outer {
    //外部类的静态属性;
    static int num0=0;
    //外部类的非静态属性;
    int num1=1;
    //静态内部类;
    static class Inner{
        //静态内部类的方法;
        public void InTest(){
            //只能获取静态属性或方法;
            System.out.println(num0);
        }
    }
}

局部内部类


局部内部类;定义在外部类的成员方法或者作用域中;局部内部类的生命周期和外部类的成员方法一样.

//外部类
public class Outer {
    //外部类的成员方法;
    public void OutTest(){
        System.out.println("外部类成员方法");
        //局部内部类;
        class Inner{
         //局部内部类的属性
            int a=0;
        }
    }
}

匿名内部类


匿名内部类:没有名字的类.是内部类的简化写法.

可用来,实现接口,或者继承抽象类时的类(由于接口,抽象类都不能被实例化);但是如果是一个类的多个位置需要用到这个接口或者抽象类的方法时,就不能创建多个匿名内部类了;

在匿名内部类中,使用this关键字调用时,this表示匿名内部类对象.


例如:抽象类Demo:

//抽象类;不能被实例化;
public abstract class Demo {
    //抽象方法;
    abstract void  test();
}

用匿名内部类:

//外部类;
public class Outer{
    //外部类成员方法;
    public void OutTest(){
        //匿名内部类
        new Demo(){
            //重写抽象类方法;
            @Override
            void test() {
            System.out.println("抽象类的Test方法");
            }
        }.test();
    }
}


3.内部类的意义


(1)内部类的封装性;

比如说在内部类中实现的一些功能;外界不能随意访问;就例如私有权限修饰内部类时,就得通过外部类的方法来获取内部类.

(2)内部类实现了多继承;

首先,在java的语言中,一个类只能直接地继承一个类;可以间接继承别的类(例如A类直接继承B类,而B又直接继承了C类,那么A类也就间接间接地继承了C类);但是 一个类不可以直接地继承多个类;假如说A类同时直接继承了B类和C类;这时候B类和C类中有同样名称的成员变量或方法;A类想要调用父类的属性时,分不清楚调用的是哪个父类的)


例如有一个类A是直接继承了类B;但是这个类A还想要用抽象类W里面的方法; 这时内部类出现了;就拿匿名内部类来说,有个匿名内部类Q;它继承了一个抽象类W;然后呢,这个匿名内部类放在了一个类A的方法中; 此时A类只要调用自己的方法就可以接触到抽象类的方法.那么也相当于A类继承类抽象类W.

(3)匿名内部类实现了回调功能.

(4)解决继承及实现接口出现同名方法的问题.


以上是关于类的主要内容,如果未能解决你的问题,请参考以下文章

Java 静态成员类 非静态的成员类 局部类 匿名类

JavaSE基础(十 三 )---<内部类>成员内部类,静态内部类,局部内部类,匿名内部类,内部类的意义

Kotlin基础(十三) 嵌套类内部类和匿名内部类

java 内部类和外部类的关系

19-Java-核心类库2-包装类Integer类String类StringBuffer类StringBuilder类

Kotlin基础(十三) 嵌套类内部类和匿名内部类