最近在看java编程思想,我认为其中一些知识很细致,也很经典,其中java中的修饰符也是重要的知识点之一,虽然不是很难理解,但是对于Java的面向对象的多态,封装,抽象确是有很重要的影响,比如一个类的访问修饰符是默认的,还是public修饰符,对于包内外的访问的范围是不一样。现在我就列出比较有意思的对于范围控制权限跟多态,重写(覆盖)的重要性。
现在先简单的介绍一下访问控制修饰符分为类修饰符和成员修饰符
类修饰符很简单就是:1.public修饰符 2.包范围修饰符(默认)。3.abstract修饰符 4.final 修饰符
1.那么包访问控制符,顾名思义就是包内的所有类我都可以访问到,我都可以实例化这些对象。只要不在类名前面写上public 修饰符就是默认为包范围。
2.当public修饰类时,顾名思义就是公共的,所有类都可以访问到,包内外都可以范围到,都可以实例化该对象。
3.abstract修饰符,用于抽象类(还没有看到哈,以后解释,不好意思~~~)
4.final修饰符,用于修饰类时,表示不让任何类继承(具体更多知识,跟我看完再说哈~~~~)
成员访问修饰符有:1.public 修饰符,2,protected修饰符 3.没有修饰符(缺省修饰符)4.private修饰符
根据顺序访问权限大小是 public > protected > default(没有修饰符) > private
通过这个表格很清楚的显示了不同修饰符对成员修饰符的讲解(后续将会对这个表格再进行讲解)
那么通过今天的重点不是这个,今天的重点是访问修饰符对于继承,多态的的重要性。
现在举个例子:现在有个父类A,继承A类的子类B
public class A {
/**
* 重载方法一 修饰符为public
*
* @param i
*/
public void set(int i) {
System.out.println(String.valueOf(i));
};
/**
* 重载方法二 修饰符为protected
*
* @param i
* @param d
*/
protected void set(int i, String d) {
System.out.println(String.valueOf(i) + d);
};
/**
* 重载方法三 修饰符为private
*
* @param i
* @param d
* @param c
*/
private void set(int i, String d, String c) {
System.out.println(String.valueOf(i) + d + c);
};
}
可以看到A类重载了三个方法,注意此时方法的修饰符为public protected private。
实验开始:
当子类B继承父类A时。
1.子类不能重写(覆盖)父类A的private修饰的方法,但是子类B可以写一个跟父类A方法签名相同的方法,但是此时不能叫做方法重写(覆盖)
public class B extends A {
/*
* public void set(int i, String d, String c) {
* System.out.println(String.valueOf(i) + d + c); };
*/
public static void main(String[] args) {
B b = new B();
// b.set(1, "2", "3"); //编译器提示:The method set(int, String, String) from the type A is not visible
}
}
2.子类重写了父类public或者protected修饰的方法时,子类重写的方法修饰符访问不能变小,也就是不能是缺省的或者private
public class B extends A {
/*
* //编译器提示:Cannot reduce the visibility of the inherited method from A
*
* private void set(int i) { System.out.println(String.valueOf(i)); };
*/
/*
* //编译器提示:Multiple markers at this line
* -overrides extendstext.A.set
* -Cannot reduce the visibility of the inherited method from A
*
*
void set(int i) { System.out.println(String.valueOf(i)); };
*/
public static void main(String[] args) {
B b = new B();
}
好的,相信大家也看到了范围修饰符的重要性了吧,后续还会继续跟大家一起学习分享我java编程思想的一些小细节!!!!