内部类和外部类

一个类的修饰符

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() {
             
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值