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的概念
继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。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.静态代码块优先构造方法执行