1. 访问修饰符概述
在Java中,访问修饰符(access modifier)被用来限制类、方法和变量的可见性。Java定义了四个访问修饰符:
public
protected
default(也称为package-private)
private
这四个访问修饰符的可见性依次降低,其中public为最高级别,private为最低级别。下面我们将对这四个访问修饰符进行详细介绍。
2. public访问修饰符
public访问修饰符是Java中最常用的修饰符之一。使用public修饰的类、方法和变量可以被任何其他类访问。下面是一个使用public修饰符的例子:
public class MyClass {
public int myPublicVar;
public void myPublicMethod() {
//method implementation goes here
}
}
2.1 继承中的public访问修饰符
在继承关系中,使用public修饰的成员可以被子类继承并使用。下面是一个示例:
public class MyParentClass {
public void myPublicMethod() {
//method implementation goes here
}
}
public class MyChildClass extends MyParentClass {
//myPublicMethod is inherited and can be used here
}
3. protected访问修饰符
使用protected修饰的成员只在同一包内或子类中可见。下面是一个使用protected修饰符的例子:
public class MyClass {
protected int myProtectedVar;
protected void myProtectedMethod() {
//method implementation goes here
}
}
在同一个包中,我们可以正常访问和使用该类中的protected成员。而在其他包中,只有继承了该类的子类才能访问和使用该类中的protected成员。下面是一个示例:
package myPackage;
public class MyParentClass {
protected void myProtectedMethod() {
//method implementation goes here
}
}
package anotherPackage;
import myPackage.MyParentClass;
public class MyChildClass extends MyParentClass {
public void myMethod() {
//can use myProtectedMethod() because we inherited it from MyParentClass
myProtectedMethod();
}
}
4. default访问修饰符
使用default修饰符的成员只在同一包中可见。如果没有指定任何访问修饰符,则成员默认被设置为default。下面是一个使用default修饰符的例子:
class MyClass {
int myDefaultVar;
void myDefaultMethod() {
//method implementation goes here
}
}
在同一个包中,我们可以正常访问和使用该类中的default成员。而在其他包中,无法访问和使用该类中的default成员。下面是一个示例:
package myPackage;
class MyClass {
void myDefaultMethod() {
//method implementation goes here
}
}
package anotherPackage;
import myPackage.MyClass;
public class MyOtherClass {
public void myMethod() {
//can't use myDefaultMethod() because it has default access
MyClass obj = new MyClass();
//obj.myDefaultMethod(); <-- compilation error
}
}
5. private访问修饰符
使用private修饰的成员只在该类中可见,其他类无法访问和使用。下面是一个使用private修饰符的例子:
public class MyClass {
private int myPrivateVar;
private void myPrivateMethod() {
//method implementation goes here
}
}
在其他类中,我们无法访问和使用该类中的private成员。下面是一个示例:
public class MyOtherClass {
public void myMethod() {
MyClass obj = new MyClass();
//can't use myPrivateVar or myPrivateMethod because they are private
//obj.myPrivateVar; <-- compilation error
//obj.myPrivateMethod(); <-- compilation error
}
}
6. 方法重写
在Java中,当子类继承了父类的方法并且需要修改该方法的实现细节时,就可以使用方法重写(method override)的技术。
6.1 方法重写的概念
方法重写指的是在子类中声明一个与父类中同名、参数列表也相同、但实现细节不同的方法。使用方法重写可以修改继承来的方法,从而更好地适应子类的需求。
6.2 方法重写的注意事项
在进行方法重写时,需要遵守以下注意事项:
重写方法必须与父类方法有相同的名称和参数列表。
重写方法的访问修饰符不能比父类方法的访问修饰符更严格。
重写方法不能抛出比父类方法更宽泛的异常。
重写方法不能使用比父类方法更严格的访问控制修饰符。
重写方法可以使用比父类方法更宽泛的返回类型。
6.3 方法重写的示例
下面是一个使用方法重写的示例:
public class MyParentClass {
protected void myProtectedMethod() {
System.out.println("Parent class method!");
}
}
public class MyChildClass extends MyParentClass {
protected void myProtectedMethod() {
System.out.println("Child class method!");
}
}
//调用方法
MyParentClass parent = new MyParentClass();
MyChildClass child = new MyChildClass();
parent.myProtectedMethod(); //调用的是父类方法,输出"Parent class method!"
child.myProtectedMethod(); //调用的是子类方法,输出"Child class method!"
在上面的示例中,子类MyChildClass继承了父类MyParentClass的方法myProtectedMethod(),并且重写了该方法的实现细节。在调用myProtectedMethod()时,如果调用的是父类实例的方法,则会输出"Parent class method!",如果调用的是子类实例的方法,则会输出"Child class method!"。
7. 总结
Java中的访问修饰符和方法重写是面向对象编程的两个重要概念。使用访问修饰符可以控制类、方法和变量对外的可见性,从而增强代码的封装性和安全性。使用方法重写可以修改继承来的方法实现,从而更好地适应子类的需求。在进行访问修饰符和方法重写时,需要遵守一定的规则和注意事项,以确保代码的正确性和可维护性。