final关键字
1.概念:
继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。不能修饰构造方法。
2.final的特点:
1.final 修饰类不可以被继承,但是可以继承其他的类(相当于太监,只能当儿子不能当爹)
package com.oracle.demo04; //final修饰类(太监类,没有子类) //不能被继承,但可以继承其他类 public final class Fu extends Object{ }
2.final 修饰的方法不可以被子类重写,但是父类中没有被final修饰的方法,子类重写后可以加final
package com.oracle.demo04; //被final修饰的方法 public class Fu2 { public final void xiuche(){ System.out.println("失传的手艺"); } public void maiche(){ System.out.println("这是祖传的卖车手艺"); } } package com.oracle.demo04; public class Zi extends Fu2{ //Cannot override the final method from Fu2 /*public final void xiuche(){ }*/ public final void maiche(){ } }
3.final 修饰的变量成为常量,这些变量只能成为一次,而且终身不变
final int i = 20; i = 30; //赋值报错,final修饰的变量只能赋值一次
4.引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性至可以修改
final Person p = new Person();//p获得一个地址 Person p2 = new Person();//p2获得一个地址 p = p2; //final修饰的变量p,所记录的地址值不能改变,所以会报错 p.name = "小明";//可以更改p对象中name属性值
5.修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
package com.oracle.demo04; //被final修饰的成员变量没有系统默认初始值 public class Zi3 { //直接赋值 //final String name="小红"; //通过构造方法赋值 final String name; public Zi3(){ name="小红"; } }
static 关键字
static概念:静态修饰符,一般用来修饰类中的成员,可以不创建对象直接调用方法
static 特点:
1.被static修饰的成员属于类,不属于类中的某个对象
class Demo { public static int num = 100; } class Test { public static void main(String[] args) { Demo d1 = new Demo(); Demo d2 = new Demo(); d1.num = 200; System.out.println(d1.num); //结果为200 System.out.println(d2.num); //结果为200 } }
2.被static 修饰的成员可以直接通过类名来进行访问
class Demo { //静态成员变量 public static int num = 100; //静态方法 public static void method(){ System.out.println("静态方法"); } } class Test { public static void main(String[] args) { System.out.println(Demo.num); Demo.method(); } }
3.static 的注意事项:
静态的内容是优先于对象存在,只能访问静态,不能使用this/super,静态修饰的内容存在于静态区
class Demo { //成员变量 public int num = 100; //静态方法 public static void method(){ //this.num; 不能使用this/super。 System.out.println(this.num); } }
同一个类中 静态成员只能访问静态成员
class Demo { //成员变量 public int num = 100; //静态成员变量 public static int count = 200; //静态方法 public static void method(){ //System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法 System.out.println(count); } }
main方法只是一个程序的入口,可以写在任意的一个类中
多态方法中,编译看等号的左边,父类有的话,编译成功,父类没有的话编译失败
运行静态方法,运行父类中的静态方法
运行非静态方法,运行的是子类中重写的方法
成员变量,编译和运行的都是父类
package com.oracle.demo05; public class student { String name; int age; static String schoolName; }
package com.oracle.demo05; public class test { public static void main(String[] args) { student s=new student(); s.name="小红"; s.schoolName="北京大学"; student s2=new student(); s2.name="小明"; s2.schoolName="清华大学"; System.out.println(s.schoolName+"..."+s2.schoolName); } }
原文地址:https://www.cnblogs.com/mr171733/p/9700190.html