内部类和外部类

一个类的修饰符

1.Java中源文件可以有多个类,但最多只能有一个public修改,如果有public类,就必须与源文件的名字完全相同.
2.如果源文件中没有public类,那么源文件的名字可以任意取。
3.main()方法不是必须放在public类中才能运行程序
在这里插入图片描述
一个类的修改符只能用public或者默认的修饰符

修饰符的作用范围

修饰符所在类同内其他类其他包内子类其他包内非子类
privateYNNN
缺省YYNN
protectedYYYN
publicYYYY

内部类的定义

将一个类定义到类的内部,包括这四种:成员内部类,局部内部类,匿名内部类,静态内部类
作用:
1.内部类可以很好的实现隐藏(一般的非内部类,是不允许有private与protected权限的,但内部类可以)
2.内部类拥有外围类的所有元素的访问权限(内部类可以访问外部类的所有方法和属性,包括private)
3.可以实现多重继承(接口虽然可以实现多重继承,但是必须实现所有的方法)
4.可以避免修改接口而实现用一个类中两种同名方法的调用(同一个类中,如果需要定义的方法和实现接口的方法一样,就不行,但是内部类去实现可以避免这样的问题)

成员内部类

成员内部类可以无条件访问外部类的所有成员属性和方法。如果成员内部类拥有和外部类同名的成员变量或方法时,就会默认访问成员内部类的成员,如果要访问外部类的同名成员,就使用:

外部类.this.成员变量
外部类.this.成员方法
public class ClassTest {
    private int i = 0;
    class Test{
        private void Test1(){
        }
    }
    public static void main(String[] args){
        System.out.println("这是main方法");
    }
}

外部类访问成员内部类:

public class ClassTest {
    private int i = 0;
    private Test testDemo = null;
    class Test{
        private void Test1(){
            System.out.println(i);
        }
    }

    public Test getTestInstance(){
        if(testDemo ==null){
            testDemo = new Test();
        }
        return testDemo;
    }

    public static void main(String[] args){
        System.out.println("这是main方法");
        //第一种方法
        ClassTest classTest = new ClassTest();
        ClassTest.Test test = classTest.new Test();
//        Test t1 = new Test();   这样直接写是不行的
		//第二种方法
		ClassTest.Test test1 = classTest.getTestInstance();

    }
}

因为成员内部类是依附与外围类,是外围类的一个成员,所以只有先创建外围类对象才能创建内部类对象,so 成员内部类不能还static的变量和方法,但是可以有static final 修饰的,也可以集成含static成员的类,如果一个成员内部类只希望被外部类操作,就可以使用private将其声明私有内部类。

局部内部类

局部内部类:他是嵌套在方法和作用域内的,对于这个类的使用主要是应用于解决比较复杂的问题,想创建一个类来辅助我们的方案,但是又不希望这个类的公共可以的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
在方法内定义

 public Map destionation(String s){
        class Destionation extends HashMap {
            private Destionation(String d){

            }
        }
        return new Destionation("ekw");
    }

在作用域内被定义

 public boolean test2(boolean b){
        if(b){
            class InnerTest2{
                private int d = 0;
            }
            InnerTest2 innerTest2 = new InnerTest2();
        }
        //InnerTest2 innerTest2 = new InnerTest2();会报错
        return false;
    }

匿名内部类

public void test3(){
        new Runnable(){
            @Override
            public void run() {

            }
        };
    }

静态类

静态内部类不能访问非静态的属性和方法

class Outter {
    public Outter() {
         
    }
     
    static class Inner {
        public Inner() {
             
        }
    }
}
内部类外部类有同名函数时,这种情况可能会导致一些混淆。下面详细介绍它们的工作机制以及如何处理这种场景。 ### 内部类外部类同名函数 #### 1. 基本概念 - **外部类**:是指直接定义在源文件中的类。 - **内部类**:是指在一个类的内部定义的另一个类,可以访问该外部类的所有成员(包括私有的)。 如果内外两个类中有相同的函数名称,并不会引起冲突,因为它们属于不同的命名空间。然而,在实际编码过程中确实有可能会遇到需要明确指定调用哪一个的情况。 #### 2. 访问规则 当你从内部类中尝试访问名为`method()`的方法时,默认情况下它将查找并优先考虑自身具有的这个方法;只有当内层找不到对应的方法才会向外寻找直至最外层或抛出异常。 如果你想显式地调用外部类里的那个同名字的方法,则可以通过使用 `OuterClassName.this.methodName();` 的形式来做到这一点。 ```java public class OuterClass { public void show() { System.out.println("This is outer method."); } class InnerClass { public void show() { // 显示当前内部类的信息 System.out.println("This is inner method."); // 调用外部类的方法 OuterClass.this.show(); } } } ``` 在这个例子中,当我们创建了一个`InnerClass`的对象并且调用了它的`show()`方法后,首先打印的是"这是内部的方法."然后通过`OuterClass.this.show();`这行代码实现了对外部类`show()`方法的成功调用,结果将会显示 "这是外部的方法." #### 3. 注意事项 虽然理论上允许存在这样的结构,但在实践中最好避免这样做以保持代码清晰度。良好的实践建议尽量给每个方法赋予唯一而有意义的名字以便于理解维护程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值