三个修饰符
static修饰符
对象共享这种static定义的东西(包含属性,方法和代码块)。
修饰:1.属性
访问方式可以通过对象.属性名方式访问,也可以通过类名.属性名访问
static修饰的属性什么时候被初始化?
类变量在类加载的时候就已经初始化了,而类加载在创建对象之前。
public class TestStaticField {
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.out.println("学校地址:"+Student.address);
Student s=new Student();
Student s1=new Student();
s1.address="烟台大学";
System.out.println("学校地址:"+s1.address);
System.out.println("学校地址:"+s.address);
}
}
/**
* 学生类
*/
class Student{
public static String address="烟台大学";
private String name;
private int age;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
2.方法
非静态方法无论属性和方法是否是静态的都可以访问
静态方法只能访问静态属性和静态方法
静态方法中不能使用this关键字
子类静态的方法可以覆盖父类静态的方法,但是失去了多态。
静态的属性或者方法都是跟类绑定的,而非静态的都是和对象绑定的。
3.静态代码块
静态代码块在类加载的时候,可以认为是使用类的时候该类内的静态块会执行。
public class TestStatic {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student.sleep();
}
}
class Student{
static {
System.out.println("---------------");
}
static int age;
String name;
}
final修饰符
final ---最后的,最终的。
1. 修饰变量
实例变量,局部变量。
一旦赋值,他的值就不能改变
局部变量可以先定义成final,然后在进行赋值,但是只能赋值一次。
final int a;
a=10;
final修饰属性时,必须对属性显示赋值或提供构造方法对属性赋值
通过构造方法赋值:class A{
final int a;
public A(int a){
this.a=a;
}
}
Static和final可以结合使用来定义一个常量,并且该常量归类所有。可以通过类名.属性名访问
public static final double PI = 3.14159265358979323846;
public class TestFinalVariable {
public static final int MA=0;//属性如果定义为final要求开始定义的地方就要进行初始化或者也可以不初始化,但是
public static void main(String[] args) {
// TODO Auto-generated method stub
/*final int la;//final修饰的局部变量只能被赋值一次
//修改局部变量的值
la=9;
System.out.println(la);*/
//TestFinalVariable t=new TestFinalVariable(3);
System.out.println(TestFinalVariable.MA);
}
}
Final修饰的变量不能修改,方法不能被重写,类不能被继承,可以和 static联合使用
abstract修饰符
什么是抽象?
不容易出错,没有具体的解决方案,但是提供了一个规范
可以用于类和方法的修饰
1.如果一个类中某个方法是抽象的,这个类就必须是抽象的。
abstract class Student{
static {
System.out.println("---------------");
}
static int age;
String name;
public abstract void study();
public static void sleep(){
System.out.println("i sleep 8 hours");
}
}
2.一个类里面所有的方法都是非抽象的,这个类也可以声明为abstract
3抽象类可以被子类继承,并重写其中的抽象方法
4抽象类不能直接用来创建对象