访问控制
Java主要通过访问控制符
、类包
和final
关键字对类、方法或者变量的访问范围进行控制。
访问控制符
注意:Java语言中,类的权限设定会约束类成员约束的权限
。
使用访问控制符时,需要遵循以下原则:
1) 大部分顶级类都使用public修饰符
2) 如果某个类主要用作其他类的父类,该类中包含的大部分方法只是希望被其子类重写,而不想被外界直接调用,则应该使用protected修饰
3) 类中绝大部分属性都应该使用private修饰,除非一些static或者类似全局变量的属性,才考虑使用public修饰
4) 当定义的方法只是用于辅助实现该类的其他方法(即工具方法)时,应该使用private修饰
5) 希望允许其他类自由调用的方法应该使用public修饰符
final关键字
final关键字表示“最后的”,被final修饰的类、方法和变量不能被改变
1) final类
被final修饰的类不能被继承
若希望一个类不允许被任何类继承,并且不允许其他人对这个类进行任何的改动,可以将这个类设置为final类
语法:final class 类名{}
当把某个类设置为final类时,类中所有方法都被隐式设置为final形式,但是final类中成员变量既可以被定义为final形式,也可以定义为非final形式
2) final方法
被final修饰的方法不能被重写
将方法定义为final类型可以防止子类修改该方法的定义与实现方式,同时final方法的执行效率要高于非final方法。在访问控制符private实际上就是隐式被指定为final。
3) final变量
final修饰的变量不能再修改变量值。通常将final修饰的变量称为常量。所有在final修饰变量时,必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型常量还可以修饰对象引用,同理,对象一旦被final修饰,它就恒定指向一个对象。一个既是static又是final的字段占据了一段不能改变的存储空间。
例:
package way_of_Class_practice;
public class FinalData { //常量测试类
final int value1=9; //声明一个常量
static final int VALUE2 =10; //声明一个静态常量
final Test obj = new Test();
public static void main(String[] args)
{
//创建常量测试类对象
FinalData f = new FinalData();
//编译器报错,因为常量不可以重新赋值
f.value1=1;
//编译报错,因为静态常量可以直接用类名调用,且不可重新赋值
FinalData.VALUE2 = 1;
//编译报错,因为常量对象不可以重新赋值
f.obj=new Test();
// 常量对象属性可以重新赋值
f.obj.i=1;
}
}
内部类
成员内部类
除成员变量、方法和构造器可以作为类的成员外,成员内部类也可作为类的成员。
语法:
public class OuterClass{ //外部类
private class InnerClass{//内部类
//….
}
}
内部类对象的创建:
OutClass.InnerClass innerclass = OutClass.new InnerClass()
;
例:
package way_of_Class_practice;
public class Class {
int num;
public Class(int num) {
this.num = num;
}
public class Teacher {
int count;
public Teacher(int count) {
this.count = count;
}
public void show() {
System.out.println(num + "班有教师" + count + "名");
}
}
public class Student {
int count;
public Student(int count) {
this.count = count;
}
public void show() {
System.out.println(num + "班有学生" + count + "名");
}
}
public static void main(String[] args) {
Class c = new Class(123);
Class.Teacher teacher = c.new Teacher(10);
teacher.show();
Class.Student student = c.new Student(60);
student.show();
}
}
匿名内部类
匿名内部类只需使用一次,即匿名内
部类不能被重复使用,也就是创建匿名内部类的实例后,这个匿名内部类立即消失。匿名类的所有实现代码都需要在大括号之间进行编码。
语法:
new A(){
…//匿名内部类实体
};
其中,A指代的是接口名或抽象类的类名
使用匿名内部类应遵循以下原则:
1) 匿名类没有构造方法
2) 匿名类不能定义静态的成员
3) 匿名内不能用private、public、protected、static、final、abstract等修饰
4) 只可以创建一个匿名类实例
例:
package way_of_Class_practice;
public class Fire {
public static void main(String[] args) {
// TODO Auto-generated method stub
new FireWorks() { // 创建匿名内部Firework的对象
void boom() { // 重写boom方法
System.out.println("嘭,爆竹燃放");
}
}.boom();// 匿名内部类Firework的对象调用重写抽象的包装方法
}
}