• 访问权限和this,super关键字


    权限解析

    java有四种访问权限,private default protected public。

    private:私有的,只有在自己的类中可以访问。

    default:就是不加任何修饰符,允许在自己类中访问,也运行同包中访问。

    protected:允许在自己类中访问,同包中访问,子类访问。

    public:任何情况下都可以访问。

    package a;
    
    public class Test1 {
    	protected void hello1(){
    		System.out.println("hello");
    	}
    }
    
    package a;
    
    public class Test2 {
    	public void hello2(){
    		Test1 t1 = new Test1();
    		t1.hello1();
    	}
    }
    
    package b;
    
    import a.Test1;
    
    public class Test3 extends Test1{
    
    	public void hello3(){
    		Test1 t1 = new Test1();
    		t1.hello1();//错误代码
    		
    		super.hello1();
    		this.hello1();
    		Test3 t3 = new Test3();
    		t3.hello1();
    	}
    }
    

     Test1和Test2在同包下,Test3不同包但是是Test1的子类。

    如果hello1是default权限,在Test2中的hello2方法的写法是没有问题的,在Test3中就都不可以。

    如果hello1如上是protected权限就有不同了。对于Test2来说,同样没有问题。而Test3就有问题,Test3中的t1.hello1();就是错误代码。按道理来说,protected可以在子类中访问啊,不是应该没问题么。

    因为是不同包的情况,所以t1.hello1();写法不可以。应该用的是Test3 t3 = new Test3(); t3.hello1();这种形式。或者super.hello1(); this.hello1();

    当然,这些代码只能在Test3中使用,如果离开Test3同样不可以。

    正是由于这个原因,那么protected常作为需要重写的方法的描述符。

    this关键字指的就是当前对象。

    super指向的是在子类实例化时创造的父类对象(这个对象与父类自己new出来的有一定区别)。

    super相关

    package a;
    
    public class Test1 {
    	
    	public Test1(){
    			
    	}
    	
    	public Test1(String s){
    		
    	}
    }
    
    package b;
    
    import a.Test1;
    
    public class Test3 extends Test1{
    
    	public Test3(){
    		super("test3");
    		System.out.println("test3");
    	}
    }
    

     对于任何一个类来说,它默认是有一个构造方法(如果加上了其他构造方法,默认的就消失了),而构造方法当中会隐式的调用父类的构造方法。对于Test1来说,会默认调用父类Object的默认无参构造方法。Test2会默认调用Test1的默认无参方法。

    当然可以显式的调用,比如super("test3");,不过显式调用父类构造方法必须要放在构造方法的第一行,如果放在System.out.println("test3");后面就会报错。

    如果父类没有默认的无参构造方法,比如把第一个构造方法注释掉,那么此时只能够显式的调用构造方法,否则报错。

    因为任何类都需要调用父类的构造方法。

     
  • 相关阅读:
    SPI(1)——Documentation/spi/spi_summary.txt翻译
    TCP协议详解(TCP报文、三次握手、四次挥手、TIME_WAIT状态、滑动窗口、拥塞控制、粘包问题、状态转换图)
    Linux设备树(3)——Linux内核对设备树的处理
    Linux设备树(2)——设备树格式和使用
    [转]Android的taskAffinity
    [转]深入了解iPad上的MouseEvent
    NG2入门
    TypeScript 素描
    TypeScript 素描
    TypeScript 素描
  • 原文地址:https://www.cnblogs.com/tp123/p/6406576.html
Copyright © 2020-2023  润新知