zoukankan      html  css  js  c++  java
  • 访问权限和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");后面就会报错。

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

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

     
  • 相关阅读:
    【css】如何实现响应式布局
    【PHP】foreach语法
    【css】cursor鼠标指针光标样式知识整理
    【JavaScript】修改图片src属性切换图片
    【PHP】PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
    【PHP】常用的PHP正则表达式收集整理
    【Mysql】mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围
    js获取url参数的方法
    SQL Server 2008 geometry 数据类型
    SQL Server 存储过程之基础知识(转)
  • 原文地址:https://www.cnblogs.com/tp123/p/6406576.html
Copyright © 2011-2022 走看看