首先是访问控制的关键字,分
public、protected、default、private四种,权限如下:
public的权限是最大的,private权限最小
下面是一些常用的关键字:
一、final
(一)final修饰的属性
被final修饰的属性表示此变量为常量, 一旦赋值则不能被改变,
如下面类中的CONSTANT:
当然也可以在这个常量声明的时候就给它赋值,这样在其他地方就不能再修改了。
虽然final修饰的变量不能被修改,但依然可以被继承并使用,只不过同样地不能在子类中修改此常量。
下面用一个子类继承上面的Person类:
另外因为常量的特殊性,所以在创建常量时一般用全大写,如上面的CONSTANT,以区分和常量和一般变量。
(二)final修饰的方法
被加final关键字的方法或属性是不能被继承的类修改的。将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。
如有一个Person类:
这个Person类有一个final修饰的方法speak(),然后我们让另一个类Student继承它:
可以发现,如果在Student里面重写speak()方法编译器会报错,这是因为在Person里面已经将speak()定义为final类型了,而另一方面,虽然不能在Student里面重写此方法,但从主函数里可以看到依然可以在Student里面调用speak()方法,这说明speak()方法依旧能被继承,只不过不可被重写。
二、static
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。
(一)被static修饰的成员变量
如下,当一个变量被声明为static时,在其他类中要引用此变量时,可以不用创建一个特定的对象,而是可以直接通过类名来调用:
当然也可以通过创建对象来调用此静态变量,但是因为被static修饰的成员变量独立于该类的任何对象这种特殊性,如果某一个对象修改了这个静态变量,则会永久修改这个变量值直到另一个对象再次修改,代码如下:
如果name这个属性不是static的,结果显而易见应该是小名 is speaking和小芳 is speaking,但是当name有static修饰的时候,运行结果反而是:
小芳 is speaking
小芳 is speaking
这是因为当创建第一个对象时,我们赋给了name一个值“小名”,然后再创建另一个对象赋值给name另一个值“小芳”,应该注意到这两个name实际上是一个name,修改之后这个类的所有对象共享的name就是“小芳”了,所以后面无论用哪个对象去调用name,结果都是“小芳”。
(二)被static修饰的方法
在static修饰的方法中只能引用本类的静态成员变量
当然静态成员变量可以在非静态方法内使用。而且在静态方法中,可以引用其他类的非静态常量。另外需要注意的是在静态方法中就不能使用this了,因为此方法无需创建对象。
(三)静态域
静态域也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
值得注意的是静态方法块执行先于构造方法,如下:
运行结果为:
前静态代码块
后静态代码块
构造方法
在接口中声明成员变量时往往会同时用到final和static,这是因为接口应要标准化,内容不能被随意更改。
(权限) public protected default private | |
同一类中 ok ok ok ok | |
同一包中 ok ok ok | |
子类中 ok ok | |
不同包中 ok |
public的权限是最大的,private权限最小
下面是一些常用的关键字:
一、final
(一)final修饰的属性
被final修饰的属性表示此变量为常量, 一旦赋值则不能被改变,
如下面类中的CONSTANT:
class Person{
public final int CONSTANT;
public Person()
{
CONSTANT = 8;
// CONSTANT = 9;//编译器报错,final类型CONSTANT已被初始化,不能被修改
}
}
当然也可以在这个常量声明的时候就给它赋值,这样在其他地方就不能再修改了。
虽然final修饰的变量不能被修改,但依然可以被继承并使用,只不过同样地不能在子类中修改此常量。
下面用一个子类继承上面的Person类:
class Student extends Person{
public Student()
{
// CONSTANT++; //错误,不能修改常量
System.out.println(CONSTANT); //正确,可以在子类中使用此常量
}
}
另外因为常量的特殊性,所以在创建常量时一般用全大写,如上面的CONSTANT,以区分和常量和一般变量。
(二)final修饰的方法
被加final关键字的方法或属性是不能被继承的类修改的。将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。
如有一个Person类:
class Person{
public final void speak()
{
System.out.println("我是父类");
}
}
这个Person类有一个final修饰的方法speak(),然后我们让另一个类Student继承它:
class Student extends Person{
// public void speak()
// {
// System.out.println("我是学生");
// }
// 编译器报错,不能重写此方法。
public static void main(String[] args) {
new Student().speak();
}
}
可以发现,如果在Student里面重写speak()方法编译器会报错,这是因为在Person里面已经将speak()定义为final类型了,而另一方面,虽然不能在Student里面重写此方法,但从主函数里可以看到依然可以在Student里面调用speak()方法,这说明speak()方法依旧能被继承,只不过不可被重写。
二、static
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。
(一)被static修饰的成员变量
如下,当一个变量被声明为static时,在其他类中要引用此变量时,可以不用创建一个特定的对象,而是可以直接通过类名来调用:
class Person{
public static String s = "ddd";
}
class Student{
public Student()
{
System.out.println(new Person().s);
}
}
当然也可以通过创建对象来调用此静态变量,但是因为被static修饰的成员变量独立于该类的任何对象这种特殊性,如果某一个对象修改了这个静态变量,则会永久修改这个变量值直到另一个对象再次修改,代码如下:
class Person{
private static String name;
public Person(String name)
{
this.name = name;
}
public void speak()
{
System.out.println(name+" is speaking");
}
public static void main(String[] args) {
Person p1 = new Person("小名");
Person p2 = new Person("小芳");
p1.speak();
p2.speak();
}
}
如果name这个属性不是static的,结果显而易见应该是小名 is speaking和小芳 is speaking,但是当name有static修饰的时候,运行结果反而是:
小芳 is speaking
小芳 is speaking
这是因为当创建第一个对象时,我们赋给了name一个值“小名”,然后再创建另一个对象赋值给name另一个值“小芳”,应该注意到这两个name实际上是一个name,修改之后这个类的所有对象共享的name就是“小芳”了,所以后面无论用哪个对象去调用name,结果都是“小芳”。
(二)被static修饰的方法
在static修饰的方法中只能引用本类的静态成员变量
class Person{
private static String name;
private String sex;
public static void speak()
{
System.out.println(name);
// System.out.println(sex); //错误,应在name前声明static
}
}
当然静态成员变量可以在非静态方法内使用。而且在静态方法中,可以引用其他类的非静态常量。另外需要注意的是在静态方法中就不能使用this了,因为此方法无需创建对象。
(三)静态域
静态域也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
值得注意的是静态方法块执行先于构造方法,如下:
public class Person{
static{
System.out.println("前静态代码块");
}
public Person()
{
System.out.println("构造方法");
}
static{
System.out.println("后静态代码块");
}
public static void main(String[] args)
{
new Person();
}
}
运行结果为:
前静态代码块
后静态代码块
构造方法
在接口中声明成员变量时往往会同时用到final和static,这是因为接口应要标准化,内容不能被随意更改。