final关键字

本文详细介绍了Java中final关键字的用法,包括修饰类、成员变量、局部变量和引用类型变量。final修饰的成员变量必须在声明时或构造器中初始化,局部变量必须在使用前赋值。对于引用类型,final变量不能重新赋值,但其引用的对象属性可以修改。文章还探讨了局部内部类和匿名内部类为何只能访问final变量的原因,以及内部类和外部方法之间的关系。
摘要由CSDN通过智能技术生成
  • 修饰类:表示类不可以被继承
  • 修饰方法:表示方法不可以被子类重写(即不可扩展),但可以在类内重载
  • 修饰变量:表示变量一旦被赋值,就不可以更改它的值

1、修饰成员变量
(1)修饰类成员变量
在声明时就需要被赋值,或者静态代码块赋值。
(2)修饰成员变量
在声明时就需要被赋值,或者代码块赋值,或者构造器赋值。

2、修饰局部变量
fianl修饰局部变量,不赋值不会报错,但使用前一定要赋值。

public class FianlVar {
	//final修饰类成员变量
	final static int a=0;//在声明时就需要被赋值,或者静态代码块赋值
	/**
	 static{
	 int a= 0;
	 }
	 */
	//final修饰成员变量
	final int b = 0;//在声明时就需要被赋值,或者代码块赋值,或者构造器赋值
	/**
	 {
	 b = 0;
	 }
	 */
	public static void main(String[] args) {
		final int c;//fianl修饰局部变量,不赋值不会报错
		c=0;//但使用前一定要赋值
		System.out.println(c);
	}
}

3、final修饰基本数据类型变量
在对final修饰的基本数据类型变量赋值之后,这个值就不可以再改变了。
4、final修饰引用类型变量
在初始化后不能让其指向另一个对象,但引用的值是可以改变的。(就是这个变量名不可以再直接用=号了,使用了就都不合法)

public class FianlReference {
	public static void main(String[] args) {
		final String aString = "jmm";
		//aString = "hhh";//不合法
		final int arr[] = {1,2,3};
		arr[2]=3;
		//arr = null;//不合法
		//可以更改其属性和方法
		final Father father = new Father("面包");
		father.setFood("汉堡包");//合法
		father=null//非法
	}
}

为什么局部内部类和匿名内部类只能访问局部fianl变量
局部内部类:定义在方法中的内部类。
匿名内部类:它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。

//匿名内部类代码示例
public class HelloWorldAnonymousClasses {

    /**
     * 包含两个方法的HelloWorld接口
     */
    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }

    public void sayHello() {

        // 1、局部类EnglishGreeting实现了HelloWorld接口
        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }
        //生成对象
        HelloWorld englishGreeting = new EnglishGreeting();

        // 2、匿名类实现HelloWorld接口,直接创建对象
        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

        // 3、匿名类实现HelloWorld接口
        HelloWorld spanishGreeting = new HelloWorld() {
            String name = "mundo";
            public void greet() {
                greetSomeone("mundo");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hola, " + name);
            }
        };

        englishGreeting.greet();
        frenchGreeting.greetSomeone("Fred");
        spanishGreeting.greet();
    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

首先需要知道一点:内部类和外部类是同级文件,都会生成class文件,内部类是不会因为外部方法执行完了就被回收的。
所以当外部类的方法结束之后,局部变量就要被销毁,但是有的时候内部类引用外部方法的变量,所以为了保证内部类正常继续运行,外部方法的变量会拷贝一份给内部类,但是为了保证内外变量值一直,不会出现内外值不一致的情况,只能将需要引用的外部参数用final修饰,这也是一种妥协。

class outclass{
	private int age =13;
	public void outprint(final int x) {
		class InClass{	
			public void name() {
				System.out.println(x);
				System.out.println(age);
			}
		}
		new InClass().name();
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值