Java中的关键字

首先是访问控制的关键字,分 public、protected、default、private四种,权限如下:

 (权限)      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,这是因为接口应要标准化,内容不能被随意更改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值