精通Java 面试 04题 关于final 的两个问题(持续更新中)

问题:

一、简述 fianl 作用
二、为什么局部内部类和匿名内部类只能访问局部final变量?

解答:

一、简述 fianl 作用
答案:
final 在Java中可以用来修饰类、修饰方法、修饰变量。
如果修饰类,表示类不可被继承。
如果修饰方法,表示方法不可被子类覆盖。但是可以重载。
如果修饰变量,要分成基础数据类型引用类型数据

基础数据类型: 数值一旦初始化后,不可更改。
引用类型数据:初始化后便不能指向另一个对象。但是引用的值可以变。
引用型:
final int[] arr={1,2,3,4};
arr[2]=-3; // 合法
arr == null; // 非法,arr不能重新赋值。
再如,
final Person p = new Person(25); // 给p 设置 age = 25
p.setAge(24); //合法
p = null; // 非法


二、为什么局部内部类和匿名内部类只能访问局部final变量?

解答这个问题,首先需要明白什么是 内部类和外部类。(在最下面,一会解释)

答案:
        首先,内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法执行完毕就被销毁。
        方法执行时,局部变量复制了一份作为内部类的成员变量,当局部变量死亡后,内部类仍然可以访问它。
        将局部变量复制为内部类的成员变量时,必须保证变量一样,就将局部变量设置为final,初始化就不允许修改这个变量了。

内部类和外部类(作为扩展内容)

外部类访问内部类

在外部类的main方法中创建了外部类的对象,并通过它创建了内部类的对象,并调用了内部类的方法,这里我们观察调用时,age变量的变化

public class People {	
	         private String name;
	         private int age=20;
	         private int ID ;	     	     
	         public static void main(String[] args){
	         // 创建一个外部类对象 People
		    	 People p = new People();
		    	 // 通过外部类对象 People ,创建了内部类的对象 Student
		    	 People.Student s = p.new Student();
		    	 //  调用 内部类的方法
		    	 s.study();	    	 
	     }	    	
	    class Student {
		    	private String name;
		    	private int age=18;
		    	private int studentNumber;
	    		public void study(){
		    		System.out.println("输出age"+age);
		    		System.out.println("内部类变量"+this.age);
		    		System.out.println("外部类变量"+People.this.age);			 
		    		// 输出age18、内部类变量18、外部类变量20   		
	    	}	    	    	
	    }	

局部内部类

public class People {	
	       private String name;
	       private int age=20;
	       private int ID ;	          
	       public static void main(String[] args){
		       People p = new People();
		       // 局部内部类
		       class Student {
			       private String name;
			       private int age=18;
			       private int studentNumber;	    	
		  	       public void study(){
		  	       System.out.println("输出age"+age);
		               System.out.println("内部类变量"+this.age);
		  	       System.out.println("外部类变量"+p.age);			    		
	    	   }	 
	        }
	        new Student().study();
	    }
}

匿名内部类

abstract class People {	
	     private String name;
	     private int age=20;
	     private int ID ;	     	     
	     public abstract void work();    
}
 public class Test{	   	   
	     public static void main(String[] args){	    	  
		     Test t = new Test();
		     // test 里 创建一个 匿名内部类,调用 work 方法
		      t.test(new People(){
		      public void work(){
		      System.out.println("我在工作");
	        	}
	         });
	      }	        
	       public void test(People people){
		         people.work();
		}			
}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值