面向对象中的final和static关键字特点总结

1 final的特点

1.1 final修饰类不可以被继承,但是可以继承其他类。

class Yy {}

final class Fu extends Yy{} //可以继承Yy

class Zi extends Fu{} //不能继承Fu

1.2 final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。

class Fu {

// final修饰的方法,不可以被覆盖,但可以继承使用

    public final void method1(){}

    public void method2(){}

}

class Zi extends Fu {

//重写method2方法

public final void method2(){}

}

1.3 final修饰的变量称为常量,这些变量只能赋值一次。

final int i = 20;

i = 30; //赋值报错,final修饰的变量只能赋值一次

1.4 引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。

final Person p = new Person();

Person p2 = new Person();

p = p2; //final修饰的变量p,所记录的地址值不能改变

p.name = "小明";//可以更改p对象中name属性值

p不能为别的对象,而p对象中的nameage属性值可更改。

1.5 修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)

class Demo {

//直接赋值

final int m = 100;

//final修饰的成员变量,需要在创建对象前赋值,否则报错。

final int n;

public Demo(){

//可以在创建对象时所调用的构造方法中,为变量n赋值

n = 2016;

}

}

2 static特点

2.1 static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个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.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注意事项

3.1 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。

class Demo {

//成员变量

public int num = 100;

//静态方法

public static void method(){

//this.num; 不能使用this/super

System.out.println(this.num);

}

}

3.2 同一个类中,静态成员只能访问静态成员

class Demo {

//成员变量

public int num = 100;

//静态成员变量

public static int count = 200;

//静态方法

public static void method(){

//System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法

System.out.println(count);

}

}

3.3  main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中。





猜你喜欢

转载自blog.csdn.net/HelloMy_Future/article/details/80191314