java-内部类

导读:本篇文章讲解 java-内部类,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概念

把类定义在另一个类的内部,该类就被称为内部类。

如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类 (或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)

根据内部类的位置,修饰符和定义方式可以分为成员内部类静态内部类局部内部类匿名内部类

内部类的访问

  • 内部类可以直接访问外部类的属性与方法

  • 外部类需要创建内部类的对象去访问其属性与方法

内部类的分类

  • 成员内部类
  • 局部内部类
  • 静态内部类
  • 匿名内部类

成员内部类

概念:位于外部类成员位置的类

特点:可以使用外部类中所有成员变量和成员方法(包括private修饰的)

实例化:外部类.内部类 类变量 = new 外部类().new 内部类();

示例:

package java_gui.inner;
        //    外部类
public class Outter {
    private String name="外部类私有属性";
    
    //成员内部类
    class Inner1 {
        public void method() {
            //成员内部类可访问外部类属性与方法
            System.out.println(name);
        }
    }
  
}

测试:

package java_gui.inner;
public class Test {
    public static void main(String[] args) {
        //外部类.内部类 类变量 = new 外部类().new 内部类();
        Outter.Inner1 inner1 = new Outter().new Inner1();
        inner1.method();
        //外部类私有属性
    }
}

通过private修饰内部类

使用private修饰内部类,就无法通过创建对象来轻易地访问内部类了,定义一个public修饰的方法,返回新的内部类对象,可以在方法中添加判断语句起到数据安全的作用

示例:

package java_gui.inner;
        //    外部类
public class Outter {

    private String name="外部类私有属性";
    private static Inner1 inner1;


    //返回成员内部类对象
    public Inner1 getInner1(){
        if(inner1==null){
            inner1 = new Inner1();
        }
        return inner1;
    }

    //成员内部类
    private class Inner1 {
        public void method() {
            //成员内部类可访问外部类属性与方法
            System.out.println(name);
        }
        
        private void method1(){
            System.out.println("成员内部类方法");
        }
    }
    
     public static void main(String[] args) {
        Outter.Inner1 inner1 = new Outter().getInner1();
        inner1.method();
        inner1.method1();
         /*结果:
         外部类私有属性
         成员内部类方法
         */
         
    }
}

注意:

  • 成员内部类中不能写static属性/方法
  • 成员内部类可以看做外部类的成员,创建部类才能创建内部类
  • 使用private修饰的成员内部类,只能在外部类的main()方法中访问

局部内部类

  • 定义在方法或作用域中

  • 只是作用域发生改变,只能在该方法和属性中被使用

  • 与局部变量相同,不能被访问权限修饰符和static修饰符所修饰

  • 不能定义static成员

package java_gui.inner;
        //    外部类
public class Outter {

    public void test() {
        //若局部内部类访问局部变量,须将局部变量声明为final
        final String name="局部内部类";
        
        //局部内部类
        class Inner3 {
            public void method() {
				
                System.out.println(name);
            }
        }
        //局部内部类的实例化和使用必须在定义类的方法内
        new Inner3().method();
    }

    public static void main(String[] args) {
        new Outter().test();
        //结果:局部内部类
    }
}

静态内部类

也称为嵌套内部类,不能访问外部类中非静态属性/方法

实例化:

外部类.内部类 对象名 = new 外部类.内部类();

package java_gui.inner;
        //    外部类
public class Outter {

    private static String str1 = "静态变量";
    private  String str2 = "非静态变量";

    //静态内部类
    static class Inner2 {
        public void method() {
            System.out.println(str1);
            //System.out.println(str2);
            //静态内部类中不能访问外部类中非静态属性/方法
            //Non-static field 'str2' cannot be referenced from a static context
        }
    }
	
    public static void main(String[] args) {
        
        Outter.Inner2 inner2 = new Outter.Inner2();//静态内部类
        inner2.method();
        //结果:静态变量
    }
}

匿名内部类

没有名字的类,是内部类的简化写法,适用于该内部类只使用一次的情况

声明:

new/接口(){
//方法体
}

先定义一个接口

public interface Inner4 {
    public abstract void method();
}

使用匿名内部类实现接口

package java_gui.inner;
        //    外部类
public class Outter {

    public void test1 (){
        //匿名内部类  实现接口
        //写法1
        new Inner4(){
            @Override
            public void method() {
                System.out.println("匿名内部类");
            }
        }.method();
        
        /*//写法2
        Inner4 inner4 = new Inner4(){
            @Override
            public void method() {
                System.out.println("匿名内部类");
            }
        };
        inner4.method();
        */
    }
	
    public static void main(String[] args) {
       new Outter().test1();
        //结果:匿名内部类
    }
}

注意:

  • 匿名内部类没有构造方法
  • 匿名内部类中不能定义静态属性/方法/类
  • 匿名内部类也是局部内部类的一种,局部内部类的注意事项对其也使用
  • 内部类中使用this表示内部类对象,外部类.this表示外部类对象

意义

  • 封装性

  • 多继承(接口)

  • 解决继承的类与实现接口方法重名

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15634.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!