java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

final关键字:

final表示最终的不可变的,在java中可以用来修饰类或方法、局部变量、成员变量。

// 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表示当前类不能有子类,但是有父类,即使没有明确说明父类,也有个最顶级父类object,任何类都一个默认的父类object,其格式:修饰符 final class 类名称{}:
// 2.当final关键字修饰方法时,此方法将是最终方法,也就是说此方法不能不被覆盖重写,其格式:修饰符 final 返回值类型 方法名(参数){};
// 3.final关键字修饰局部变量时,那么这个变量将不能被改变。
// 4.当final关键字修饰成员变量时,必须手动赋值默认值。
public final class FinalKeyClass{//被final关键字修饰的类不能被继承,否则会报错

}

权限修饰符:

java中有四种修饰符,从大到小依次为:public > protected > (default) > private;

同一个类中被这四种修饰符修饰过的变量都可以访问到;

同一个包中,被private修饰的变量,在另一个类中不能访问,被其他修饰符修饰的可以访问到;

继承了另一个包中的父类的类中,只有被public和protected修饰的变量可以被访问到。其他修饰的不能被访问;

不同包下没有任何关系的类中定义一个变量,只有被public修饰后,在另一个类中是可以被访问到的,其他修饰符修饰后不能被访问;

内部类:

概念:将类A定义在类B中,类A就称为内部类,B则称为外部类;内部类可以随意访问外部类中的成员,但是外部类访问内部类中的成员时需要借助内部对象。

分类:成员内部类、局部内部类(包含匿名内部类)

// 外部类InClass:
public class InClass{
    // 6-1.同名变量访问之-外部类成员变量定义:
    String str = "外部类成员变量";
    // 1.成员内部类定义格式:在某个类中定义一个和外部类类似的类:修饰符 class 类名称{},如:在InClass类中定义一个成员内部类:AnyClass,此时InClass则为外部类:
    public class AnyClass{
        // 6-2.同名变量访问之-内部类成员变量定义:
        String str = "内部类成员变量";
        String str2 = "内部类成员变量2";
        public void methodAny(){
            System.out.println("内部类的方法执行了");
            // 2.内部类中访问外部类中的成员(变量):
            System.out.println(say + "my name is kuhai");
            // 6-3.同名变量访问之-内部类局部变量定义:
            String str = "内部类中局部变量";
            // 7.访问同名变量:
            System.out.println(str);//内部类中局部变量
            System.out.println(this.str);//内部类成员变量
            System.out.println(InClass.this.str);//外部类成员变量
            System.out.println(str2);//内部类成员变量2
        };
    };

    // 定义一个外部类的成员变量:
    private String say = "hello,";
    // 定义一个外部类的方法:
    public void methodIn(){
        System.out.println("外部类的方法执行了");
        // 3.内部类的使用:分间接使用和直接使用:
        // 间接使用内部类:在外部类的方法中创建一个内部类的对象,并调用内部类中的方法,在外部类的对象中使用外部类的这个方法即可:
        AnyClass anyObj = new AnyClass();
        anyObj.methodAny();
        // new AnyClass().methodAny();这里可以使用匿名对象代替上面两行代码,利用匿名对象的一次性,可以结合方法,每调用一次方法就会创建一次匿名对象

        // 8.定义局部内部类格式:在外部类方法中定义类,如:
        class AnyInClass{//注意:局部内部类无权限修饰符修饰;外部类只能使用public、default;成员内部类四种权限修饰符都可以使用;
            int num = 5;
            /*num = 7;java8+开始,局部内部类中访问某个变量时,这个变量应该是保持不变的,实际上是用final关键字修饰的,但是这里可以省略,只要保证值不变即可。
            局部变量是在方法中,而方法是在栈内存中,因此局部变量也是在栈内存中,当方法运行结束后就会出栈,局部变量也跟着消失;new出来的东西会在堆内存中,
            堆内存中的东西要等垃圾回收后才消失,这里new出来的对象用到局部变量时,会复制局部变量及值,即使方法出栈局部变量消失,这里的对象依旧可以使用复制的值运行,但是这个值不能改变*/
            public void anyinmethod(){
                System.out.println("局部内部类变量:"+num);//局部内部类变量:5
            };
        };
        // 9.局部内部类中只能自己访问自己的局部变量或在当前方法中再创建一个局部内部类的对象来使用,如:
        AnyInClass anyinobj = new AnyInClass();
        anyinobj.anyinmethod();
        System.out.println(anyinobj.num);//5
        /*总结:内部类访问变量的规则:先在当前作用域查找是否有变量,有的话就访问,没有的话则向上继续查找,没有则报错;
    ·   局部变量访问规则:局部变量只能在它的方法内使用,超出方法就不能使用了;
        局部内部类访问规则:在局部内部类中访问或在局部内部类所在方法中创建局部内部类的对象访问;
    ·   访问内部类的同名变量格式:this.变量名;
    ·   访问外部类的同名变量格式:外部类名.this.变量名;
    ·   */
    };
}
// 定义Myinterface接口:
public interface Myinterface{
    public abstract void methodinterface();
};
// 定义创建一个外部类对象的类:
public class InClassObj{
    public static void main(String[] args){
        // 4.创建外部类的对象并调用外部类中的方法间接的使用内部类的成员:
        InClass inClassObj = new InClass();
        inClassObj.methodIn();//当执行此文件后可以看到执行的结果:
        // 外部类的方法执行了
        // 内部类的方法执行了
        // hello,my name is kuhai
        // 内部类中局部变量
        // 内部类成员变量
        // 外部类成员变量
        // 内部类成员变量2,说明间接使用内部类成功了
        
        // 5.直接使用内部类:直接使用内部类中的成员是有固定格式的,其格式为:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();如:
        InClass.AnyClass inClassObj2 =new InClass().new AnyClass();
        inClassObj2.methodAny();//运行结果如下:
        // 内部类的方法执行了
        // hello,my name is kuhai
        // 内部类中局部变量
        // 内部类成员变量  
        // 外部类成员变量  
        // 内部类成员变量2,说明直接使用内部类成功了

        
        // 10.匿名内部类定义格式:接口名称 对象名 = new 接口名称(){注意:需要覆盖重写接口中所有抽象方法},这一句大括号中的内容被称为匿名内部类;直接new接口会报错,但是给接口定义实现类又显得麻烦,可以使用匿名内部类代替接口实现类,常用于只创建一次对象的情况,如:
        Myinterface obj = new Myinterface(){
            @Override
            public void methodinterface(){
                System.out.println("匿名内部类中覆盖重写接口中的方法执行了");//匿名内部类中覆盖重写接口中的方法执行了
            };
        };
        // 11.使用匿名内部类:
        obj.methodinterface();
        //当然这里可以省略对象名直接在大括号面通过.访问,如:new Myinterface(){}.methodinterface()
    };
};

在这里插入图片描述

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦海123

快乐每一天!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值