Java SE 023 static与final使用陷阱

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Java SE 023 static与final使用陷阱

1.static 修饰方法

(1)static修饰的方法叫做静态方法。它的使用方式与静态属性使用类似。既可以通过实例名访问,也可以通过类名.方法名直接访问。

public class StaticTest2{
    
    
	public static void main(String [] args){
    
    
		//MyStatic mystatic = new MyStatic();
		//mystatic.output();
		MyStatic.output();
	}
}

class MyStatic{
    
    
	public static void output(){
    
    
		System.out.println("output");
	}
}

2.static在继承中的一个特点

public class StaticTest3{
    
    
	public static void main(String [] args){
    
    
		//N n = new N();
		//n.output();	
		M m = new N();
		m.output();
	}
}

class M{
    
    
	public static void output(){
    
    
		System.out.println("M");
	}
}

class N extends M{
    
    
	public static void output(){
    
    
		System.out.println("N");
	}
}

解说:

(1)Intance Method:实例方法。不带static关键字的方法就叫做实例方法。

(2)class Method:类方法。表示通过类名可以调用的方法。即static方法。

如果一个子类,定义了一个方法,这个方法与父类的方法有同样的方法声明,我们说子类中的方法叫隐藏了父类中的方法。

2.1隐藏与重写它们之间的区别

(a)在被调用的时候,被重写的方法,是位于子类里面的。根据之前讲的,指向哪个就调用谁,被调用方法是在子类里面,而不在父类里面。

(b)而在被调用的时候,被隐藏的方法,是父类的版本还是子类的版本,取决于它是从父类调用的,还是从子类调用的。即取决于从哪一个类的类型去调用的那一个方法。

2.2总结

(1)静态方法是可以被继承下来的。

public class StaticTest3{
    
    
	public static void main(String [] args){
    
    
		N n = new N();
		n.output();	
		//M m = new N();
		//m.output();
	}
}

class M{
    
    
	public static void output(){
    
    
		System.out.println("M");
	}
}

class N extends M{
    
    

}
public class StaticTest3{
    
    
	public static void main(String [] args){
    
    
		//N n = new N();
		//n.output();	
		M m = new N();
		m.output();
	}
}

class M{
    
    
	public static void output(){
    
    
		System.out.println("M");
	}
}

class N extends M{
    
    
	public static void output(){
    
    
		System.out.println("N");
	}
}

(1)通过以上例子,可以看出,子类可以继承父类的静态方法

(2)但是注意一点,子类不能重写父类的静态方法。在这种情况下发生了叫做:隐藏了父类的静态方法。子类没法重写父类的静态方法。

(3)在隐藏的时候,到底调用的是父类的版本还是子类的版本,取决于前面引用的类型到底是什么。如果是父类型的,就调用父类型的方法,是子类型的对象,就调用子类型的方法。

3.静态方法只能继承,不能重写(Override)。

public class StaticTest3{
    
    
	public static void main(String [] args){
    
    
		//N n = new N();
		//n.output();	
		M m = new N();
		m.output();
	}
}

class M{
    
    
	public static void output(){
    
    
		System.out.println("M");
	}
}

class N extends M{
    
    
	public void output(){
    
    
		System.out.println("N");
	}
}

执行结果:去掉子类中的static关键字。

在这里插入图片描述

public class StaticTest3{
    
    
	public static void main(String [] args){
    
    
		//N n = new N();
		//n.output();	
		M m = new N();
		m.output();
	}
}

class M{
    
    
	public void output(){
    
    
		System.out.println("M");
	}
}

class N extends M{
    
    
	public static void output(){
    
    
		System.out.println("N");
	}
}

执行结果:

** 记住一句话,有静态就不要覆盖(Override),要么全静态,要么非静态。一样一个,出错。**

4.final关键字

final可以修饰属性、方法、类。

4.1final修饰类:

当一个类被final所修饰时,表示该类是一个终态类,即不能被继承。

4.2final修饰方法:

当一个方法被final所修饰时,表示该方法是一个终态方法,即不能被重写(Override)。

4.3final修饰属性:

当一个属性被final修饰时,表示该属性不能被改写。

4.4final总结:

(1)final不管修饰类、方法、属性、表示修饰的东西不能再去变动了。

(2)final修饰属性的时候,需要注意的一个地方:

  • 如果这个属性是一个一般的原生数据类型,原生数据类型的值,本生就是字面值,表示这个值不能被变更,不能把10改成20,不能把true变成false.这个很好理解。

  • 如果final修饰的是一个引用类型,表示的是这个引用类型永远的不能指向其他的对象了。一直要指向它最开始声明的时候所指向的对象。而这个引用所指向的对象本身的内容是可以发生变化的。因为这个对象的内容不管怎么变,对象指向的地址还是那个地址,不能说变了内容,地址由506逻到了507去了。

(3)总结

  • 当final修饰一个原生数据类型时,表示原生数据类型的值不能发生变化(比如说不能从10变为20);

  • 如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

这个引用所指向的对象本身的内容是可以发生变化的。因为这个对象的内容不管怎么变,对象指向的地址还是那个地址,不能说变了内容,地址由506逻到了507去了。

(3)总结

  • 当final修饰一个原生数据类型时,表示原生数据类型的值不能发生变化(比如说不能从10变为20);

  • 如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

猜你喜欢

转载自blog.csdn.net/xiogjie_67/article/details/108475668