ACAC java中final关键字

java中final关键字

/*
	1、final关键字:
		java 中的一个关键字,最终的,不可变的
		可以修饰变量以及方法,还有类等。
		
		1、修饰的方法,修饰的类无法被覆盖,无法被重写,无法被继承
			 写的方法不希望被子类修改,就加final
		
		2、final控制不了能不能调用的问题,final修饰的表示最后的,不能变的,
			 
			 不是说你加了个final,就不能调用(父类中final是不能覆盖修改的,但是可以调用,子类中用final无意义,)
			 而是说你不想这个方法被修改
			 一句话概括:final修饰的方法不能被修改,可以被调用

		3、final修饰的变量:
				final int i = 100;
				i = 200;
				错误: 无法为最终变量i分配值
				说明一旦用final 修饰变量,
				则是程序员不希望,final重新赋值,
				一句话概括:final修饰的变量只能赋一次值

		b类继承A类,想当于对A类的功能进行拓展,
		如果不希望别人对A类进行拓展
		可以给A类添加final关键字,这样A类就无法继承。
		H:\Java\Javajdk\bin
		
		

		调用子类特有的方法是,要想下转型
		A  a = new B();

		if( a instanceof B){
			B b = (B) a;
			b.teyoufangfa();
			}


	*/
 class A{

	
	public final void sum(int a,int b){
		int c = a +b;
		System.out.println("final修饰方法,进行求和:"+ a + "+ " + b + "=" + c);
	}

	 public static void main(String[] args){

		 	//final int i = 100;
			//	i = 200;
			A c = new A();
			int a = 100;
			int b = 200;
			c.sum(a,b);

			B d = new B();
			d.sum(a,b);

	 }
}
class B extends A{

}

=======================================================

/*

		final 修饰的变量,如果这个变量是一个“引用”会怎样?
		”引用“是不是一个变量呢? 是的
			
			错误: 无法为最终变量p2分配值

			final修饰的引用:
						该引用只能指向一个对象,
						并且他只能永远指向该对象,无法再指向其他对象
						并且在该方法执行过程中,该引用指向对象之后,
						不会被垃圾回收器回收
						直到当前方法结束,才会释放空间

			局部变量没有初始值,只能手动赋值,成员变量有初始值

		
*/
public class FinalTest02{

	public static void main(String[] args){

		Person p1 = new Person(12);
		System.out.println(p1.age);


		//代码怎么变化,p 也是一个变量(不过这里他叫引用)
		final Person p2 = new Person(20);
		p2.age = 40;
		//这样是可以的,因为并没有指向其他对象,可以修改内部的数据
		

		/*p2.Person(40);
			错误: 找不到符号
                p2.Person(40); 
				注意:构造方法不能用对象调用
				构造方法直接new Person(123)的时候用
				*/

		//p2 = new Person(20);
		//错误: 无法为最终变量p2分配值

	}
}
class Person{

	int age;

	public Person(int age){
		this.age = age;

	}
}

=================================================

/*

		final修饰的实例变量呢?
		万变不离其宗,final修饰的变量只能赋值一次

		实例变量如果没有手动赋值的话,系统会赋默认值

		但实例变量的话,必须手动赋值
		不赋值的话:
					final int age;
					age 未在默认构造器中初始化

*/
public class FinalTest03{	

	public static void main(String[] args){
		}
	}

	class User	{

		final int age = 12; 

		final int he;

		public User(){

			//只要赶在系统赋默认值之前赋值就行
			this.he = 180;
			
			//系统什么时候赋默认值???
			//系统赋默认值是这个时候
			(是在执行系统默认的无参构造方法的时候进行赋值),
			并不是说声明 int a 的时候赋值
			// he = 0;
		}

		//这样也可以

	}
=====================================================


/*

		
		实例变量的缺点:
				实例变量在堆中,一个对象一份,声明一百个,
				每次为这个实例变量开一个空间,它本身又不能变,浪费内存

		既然实例变量用final修饰,说明该实例变量的值不会随着对象的变化而变化

		final修饰的实例变量,一般用static修饰,存储在方法区,节省内存

		结论:static final 联合修饰的变量称为“常量”
					常量名建议全部大写,每个单词间用下划线衔接
				


```j
	常量:实际上和静态变量一样,区别:常量的值不能变

		常量和静态变量都储存在方法区,都是在类加载时初始化

		常量一般是公开的:public的,因为改不了

*/

public class FinalTest04{

	public static void main(String[] args){

	}
}

class Chinese{

	public static final String COUNTRY = "中国";
}

/*
	总结:
		final 修饰的类无法继承
		final 修饰的方法无法覆盖
		final 修饰的变量只能赋一次值
		final 修饰的引用一旦指向某个对象,则不能再重新指向其他对象,
		但该引用指向的对象内部的数据可以更改
		final 修饰的实例变量不能被系统默认赋值,只能手动赋值
		final 修饰的实例变量一般和static联合,称为常量
	*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值