莱西网站网站建设,个人做网站猛赚钱,wordpress 用户密码加密方式,全是广告的网站文章目录 可见性修饰符#xff08;访问修饰符#xff09;成员变量都应该是 private构造方法可以是 private 的public 修饰的东西尽量不要改动非 public 的类#xff0c;类名可以不和文件名相同protected 继承专属的访问控制 可见性修饰符#xff08;访问修饰符#xff09;… 文章目录 可见性修饰符访问修饰符成员变量都应该是 private构造方法可以是 private 的public 修饰的东西尽量不要改动非 public 的类类名可以不和文件名相同protected 继承专属的访问控制 可见性修饰符访问修饰符
可见性修饰符用在 类、成员方法、构造方法、静态方法、静态变量和成员变量上其可见性的范围是一样的。 只有 局部变量 和 参数 没有访问控制符。所有可能被分享的被使用到别的地方的都可以使用访问修饰符来控制可被访问的程度。 public 全局可见对所有包都可见缺省当前包可见private当前类可见protected【专门为继承打造】缺省default 对子类可见 注意 private 与 protected 不能用于修饰类与接口。缺省 虽然可以用于修饰类但是仅仅是对包中的其他类可见不同的包的类并不能实现通过 import 来导入这个类也无法继承这个类。 成员变量都应该是 private
成员变量应该都声明为 private。
如果要读写这些成员变量最好使用 get、set 方法这些方法应该是 public 的。这样的好处是如果有需要可以通过添加一些条件判断的代码检查每个属性值是否合法。
构造方法可以是 private 的
构造方法如果是 private 的那么就只有当前的类可以调用这个构造方法。
有些时候会把所有的构造方法都定义成 private 的然后使用静态方法调用构造方法因为该静态方法是 public 的可以被别的类调用而该静态方法又和 private的构造方法是同一个类中可以调用该构造方法所以就等于通过 public 的静态方法调用了 private 的构造方法。 这样的好处是可以通过代码检查某个属性值是否合法。等于加了一层过滤在静态方法中做一些判断避免直接使用构造方法创建属性是非法的实例。虽然在构造器中也可以加过滤语句但实际上调用构造器时已经在建造实例了也已经创建出来了只是在赋值时作过滤而如果是在静态方法中作过滤则直接就不会去调用构造器去生成非法实例 public class TestClass{private TestClass(String name,int age){ // 将构造方法设置为 privatethis.name name;this.age age;}public static TestClass createObj(String name,int age){ // 将静态方法设置为 publicif(age0){ // 这样可以加一层过滤避免传递非法值构建非法实例return null;}else{// return this(name,age); // 并不能调用 this()否则报错因为 this只能出现在构造器中并且必须是构造器的第一行代码。这里只是一个静态方法无法调用this()return new TestClass(name,age);}}
}// 调用方
import com.test.TestClass;public class TestUse{public static void main(String[] args){TestClass a createObj(Tom,13); // 调用 public 的静态方法来返回一个 TestClass 实例对象}
}public 修饰的东西尽量不要改动
public 的方法类似一种约定因为 public 就意味着外面的代码可以使用这个方法也就意味着你不能再对这个方法随意更改比如不应该更改方法的签名、返回值但可以优化方法体内的代码逻辑因为一旦修改可能外面的代码就可能要跟着修改否则会出现错误。 所以尤其是某些 java 的常用类其中定义的方法会很小心地使用 public。我们知道成员变量都应该定义成 private然后再用 public 的方法去操作它们。但很多类内部的操作不需要外部去使用的也可以定义成 private。定义成 public 的话你就得保证这个方法在往后不同的 java 版本中它的方法签名、返回值不能变否则就可能出很多问题。 public 方法是我们确定可以长期对外提供功能的。访问修饰符的目的不仅仅是为了限制别人的使用更加是为了规范地提供一套稳定的方法供别人使用。 而对于 private 的方法因为类外面调用不到所以无论怎么改也不会影响直接影响类外面的代码。
非 public 的类类名可以不和文件名相同
非 public 的类类名可以不和文件名相同。但因为是非 public这个类最多就只能被同一个包中的其他类所引用。 疑问1 一个 java class 文件中是否可以包含多个 class 经过实验一个 java class.java 文件中是可以同时包含/定义多个类的但只能有一个公共类并且只要有公共类public class这个class 文件的文件名就得和这个公共类名一摸一样大小写一致可以有如下两个情况 只有一个公共类TestClass 文件包含class A、class B、public TestClass、class C、… 这种还比较常见比如说 java 自带的 Math.java 文件包含了 public class Math同时还包含了多个非公共类当然这些类都是相关的服务于 Math 类的。 没有公共类Test 文件包含class A、class B、TestClass、class C、… 疑问2 main 方法只能出现在公共类中么同一个文件如果可以包含多个类是否也可以包含多个 main 方法 经过实验main 方法既可以出现在公共类public中也可以出现在非公共类中。并且一个 .java文件中可以同时有多个 main 方法每个类拥有一个 main 方法哪怕是这个.java 文件同时包含一个公共类与多个非公共类在 IEDA 中将鼠标定位到哪个类右键就可以选择执行相应类的 main 方法。 protected 继承专属的访问控制
protected 可见性default 对子类可见。
即对同一个包可见且对子类可见即便子类不在同一个包
// org.test.A 包中
public class A{protected int age 10;String name Tom;
}// org.test 包中
public class B extends A{ // 多做一层继承是为了说明 protected 可见的子类是所有子类而非仅仅是直接子类}// org.test 包中
public class C extends B{public void getAge(){System.out.println(this.age);}
// 若不注释下面的 getName 方法编译时会报错因为找不到 this.name 属性因为 name 是缺省访问修饰符只能同一个包中可见。
// public void getName(){
// System.out.println(this.name);
// }
}// org.test 包中
// 调用类
public class TestUse{public static void main(String[] args){C c new C();c.getAge(); // 10System.out.println(c.age); // 报错因为 TestUse 既不是 A 的子类也不和 A 在同一个包中所以无法看到 protected 修复符定义的 .age 属性。}
}// 若将调用类 TestUse 移动到 org.test.A 包中
public class TestUse{public static void main(String[] args){C c new C();c.getAge(); // 10System.out.println(c.age); // 10}
}子类覆盖父类的方法不可以用可见性更低的修饰符但是可以用更高的修饰符。 public protected default缺省 private 不能用可见性更低的修饰符来覆盖的原因 public class A{protected void sayHi(){System.out.println(调用的是 A 的 sayHi);}
}
public class B extends A{private void sayHi(){System.out.println(调用的是 B 的 sayHi);}
}
public class TestUse{public static void main(String[] args){A a new B();a.sayHi(); // 此时因为覆盖实际调用的应该是 B 中定义的 sayHi。但现在 B 中定义的 sayHi 却是 private即无法被其他类访问这就与多态冲突了。}
}既然你覆盖了父类方法父类的引用在指向你这个对象实例的时候就要访问你覆盖父类的这个方法如果你此时访问修饰符让我访问不了这样就矛盾了。所以你非要用可见性更低的访问修饰符来覆盖java 就直接给你报错。 所以若用 protected 来修饰方法则子类若想覆盖该方法需要至少是 protected或者 public。