static 与 final

static概念

当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?

可以的,我们可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员。

static特点

static是静态修饰符,一般修饰成员。static修饰的成员属于类,不属于单个这个类的某个对象

static修饰的成员被多个对象共享。

static修饰的成员属于类,但是会影响每一个对象。

static修饰的成员又叫类成员,不叫对象的成员。


static修饰后成员的使用

static修饰的成员可以并且建议通过类名直接访问。也可以通过某个对象访到属于类的静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员。

格式:

类名.静态成员变量名

类名.静态成员方法名(参数)

 

对象名.静态成员变量名      ------不建议,出现警告

对象名.静态成员方法名(参数) ------不建议,出现警告


静态代码块

静态代码块是定义在成员位置,使用static修饰的代码块。

特点:

l 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。

l 该类不管创建多少对象,静态代码块只执行一次。

l 可用于给静态变量赋值,用来给类进行初始化。

public class Person {

private String name;

private int age;

 //静态代码块

static{

System.out.println("静态代码块执行了");

}

}

例题


1.对于如下代码描述正确的有(  ABD  )


final class Person{

public final void eat() {
System.out.println("我是父");
}
public class Test extends Person {
final int num=3;
public final void eat() {
num++;
System.out.println(num);
}
}

A.Test 类不能继承Person类,final 修饰类不可以被继承
B.Person 的eat 方法不能被重写,因为final 修饰的方法不可以被覆盖
C.num不能被final 修饰,因为成员属性不能被final 修饰

D.num被final 修饰后只能被赋值一次,再次mm++时会编程不通过

答案: ABD


final的概念

继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?

要解决上述的这些问题,需要使用到一个关键字finalfinal的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局 部变量。

final的特点

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

class Yy {}

Final class Fu extends Yy{} //可以继承Yy类

class Zi extendsFu{} //不能继承Fu类


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

class Fu {

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

Public final void method1(){}

publicvoidmethod2(){}

}

class Zi extends Fu {

//重写method2方法

publicfinalvoid method2(){}

}


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

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

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

final Person p = new Person();
Person p2 = new Person();
p = p2; //final修饰的变量p,所记录的地址值不能改变
p.name = "小明";//可以更改p对象中name属性值

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

class Demo {

//直接赋值

finalintm = 100;

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

finalintn;

public Demo(){

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

n = 2016;

}

}

例题


3.如下描述说法正确的(   )
public class Test {
static {
System.out.println(“Test静态代码块”);
}
public Test() {
System.out.println("Test 构造方法” );
}
public static void main(String[] args){
System.out.println("Test main方法“);
Test t = new Test();
}
}


A.运行结果为:Test 构造方法 Test main方法 Test 静态代码块
B.运行结果为: Test 静态代码块 Test main 方法 Test 构造方法
C.构造方法和主函数优先静态代码块执行
D.静态代码块优先构造方法执行

答案: BD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值