java修饰符详解及一些常见问题解答

   关于java修饰符,以前总让我犯糊涂,今天来个大总结希望能给初学者提供点来帮助。

 

   四点基础介绍

 

  1.public:  这个好理解 他能修饰类,属性,方法,并且被修饰的对象什么地方都能被访问到 

 

  2.protected: 首先他只能修饰属性和方法(当然也可以修饰内部类,但这里不对内部类进行讲解,这里的类都是顶层类,下同)。被他修饰的对象在同一个包里都可以访问,如果在不同包,必须要通过其子类进行访问。

 

  3.default:(也就是什么都不填) 默认的,被他修饰的对象在同一个包里都可以访问,与protected相比,他是完全不能从包外进行访问,而protected还可以通过其子类在包外进行访问.

 

 4.private:访问权限最低,只能在自身类内.但这里要注意一点哦,来自同一个类的实例可以相互访问类中声明的属性,这个不好理解吧,那就接着看吧

 

 

解惑1:  来自同一个类的实例可以相互访问类中声明的属性

 

  这个说不清楚,先看一段代码吧,先别COPY and run,先自己想下结果会是什么:

 

 

  1. package com.sr178.test;
  2. public class TestExample {
  3.  public static void main(String[] args) {
  4.   // TODO Auto-generated method stub
  5.   AClass ref1 = new AClass(5);
  6.   AClass ref2 = new AClass(10);
  7.   //System.out.println(ref2.x);
  8.   System.out.println(ref1.add(ref2));
  9.  }
  10. }
  11. class AClass{
  12.  private int x;
  13.  public AClass(int x){
  14.   this.x = x;
  15.  }
  16.  int add(AClass ref){
  17.   return ref.x+x;
  18.  }
  19. }
  20. //class SubAClass extends AClass{
  21. // SubAClass(int x){
  22. //  super(x);
  23. // }
  24. // int add(AClass ref){
  25. //  return ref.x+x;
  26. // }
  27. //}

先别管注释的那几行,知道答案了吗?我想大部分人都会认为这个程序会报错.但不巧,运行后却出来一个结果15,好好体会吧.

 

解惑2: 关于protected的

问题描述:

第一个包中我建了个父类A,其中有一个protected修饰的属性b.  
然后在第二个包中建了一个类B继承了A.  
这个时候我用父类引用子类对象时,也就是A   x   =   new   B();时,对象属性x.b却访问不到.  
但是直接用子类的引用实现子类对象时,即B   x   =   new   B();x.b是可以访问的.  

注意哦!两个类不再同一个包中.

 

 

  1. package com.sr178.test;
  2. public class A{
  3.   protected String b="I am A";
  4. }
  5. package com.sr178.AnotherTest;
  6. public class B extends A{
  7.     protected String b ="I am B";
  8.     public static void main(String args[]){
  9.      A x= new B();
  10.      System.out.println(x.b);
  11.     }
  12. }

到这里程序是编译不过去的,在解释这个问题前,先来解释下  A x= new B();以下是一段摘文。

 

看到这里,应该明白A x= new B()了吧,因为x定义为A类型,那么编译时候就认为x是A类型的(x是一个存放类A的对象地址的引用型变量),他跟x的实际类型没有关系. 在解释这个问题上,你把A x= new B()看成A x = new A();别看那个后面的new B();这就好理解了,显然A x = new A();然后x.b会出错,因为在不同包中嘛.要改成B x = new B();才可以访问,因为如果在不同包,被protected修饰的属性或方法必须要通过其子类进行访问。

疑惑三:关于静态方法

 

  1. package com.sr178.test;
  2. public class StaticTest {
  3.  public void myExample(){
  4.   System.out.println("Father Class Method myExample");
  5.  }
  6.  public static void myStat(){
  7.   System.out.println("Father Class Method static Method myStat");
  8.  } 
  9.  /**
  10.   * @param args
  11.   */
  12. }
  13. class SubClass extends StaticTest{
  14.  public void myExample(){
  15.   System.out.println("Sub Class Method myExample");
  16.  }
  17.  public static void myStat(){
  18.   System.out.println("Sub Class Method static Method myStat");
  19.  } 
  20.  public static void main(String[] args) {
  21.   // TODO Auto-generated method stub
  22.   StaticTest s = new SubClass();
  23.   s.myExample();
  24.   s.myStat();
  25.  }
  26. }

运行结果:

Sub Class Method myExample
Father Class Method static Method myStat

 

   此处因为调用的静态方法myStat()是在编译期间就根据其声明类型决定了引用的方式,s是一个StaticTest类型,当然当调用s.myStat()时,就会调用父类的myStat(),而s.myExample()会调用子类的myExample()方法(这个不理解请参照上个疑惑).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值