www.allbetgame.us:Java入门系列之接见修饰符作用局限

2020-07-08 34 views 0

扫一扫用手机浏览

前言

之前以为Java和C#中接见修饰符差不多一样,后面才领会到照样有些差异,本节只解说学习Java中接见修饰符一些需要注重的地方或者从观点上不太好明白我们会通过现实例子来说明,若有错误之处,还请批评指正。

接见修饰符

Java默认(Default)接见修饰符权限和C#中类似(在C#中准确的说嵌套在其他类中默认可以为私有,若是直接在命名空间声明的类或结构体可以是public,也可以是internal,但一定不是私有,这里请注重),若是不提供任何接见修饰符,那么该类将具有包接见权限,好比如下在包com.company下建立不带接见修饰符的Person,然后再在该包中建立Person1,在该类中我们可以初始化Person

package com.company;

class Person {

}
package com.company;

public class Person1 {
    public  void  InitialPerson(){
        new Person();
    }
}

然则接下来我们再建立一个包com.company1,在其包下通过Person2则不能初始化Person,此时必然会泛起编译错误

package com.company1;

import com.company.Person;

public class Person2 {
    public  void  InitialPerson(){
        new Person();
    }
}

对于private私有修饰符则没有太多要解说的了,除了包罗该成员的类外,其他任何类都无法接见此类成员,Java中对照难明白的是protected修饰符, 该接见修饰符无论是Java照样C#主要用来处置继续的观点,依附我们对C#的明白,这里我们认为是本包任何类以及实现该类的子类(不管子类是否在本包中照样其他包中) ,这种说法是完全正确的吗?子类在统一包中一定可以接见,我们讨论在差别包中的情形会略显庞大一些,首先我们在包com.company界说Animal类,而在包com.company1中界说Tiger类,同时界说一个接见修饰符为protected的动物叫的方式如下:

package com.company;

public class Animal {
    protected void Shout(){
        System.out.println("Animal");
    }
}
package com.company1;

import com.company.Animal;

public class Tiger extends Animal {

}

接下来我们再在包com.company中界说一个类,然后在该类中界说方式,将上述位于差别包中的Animal和Tiger类作为参数变量,此时可以接见叫的方式

package com.company;

import com.company1.Tiger;

public class OtherAnimal {
    public void OtherMethod(Animal animal, Tiger tiger)
    {
        animal.Shout();
        tiger.Shout();
    }
}

然后我们再在Tiger子类界说一个方式,无论是通过当前实例引用照样直接通过super关键字挪用,都可以挪用基类的叫方式

package com.company;

import com.company1.Tiger;

public class OtherAnimal {
    public void OtherMethod(Animal animal, Tiger tiger)
    {
        animal.Shout();
        tiger.Shout();
    }
}

固然若我们在基类Animal中界说方式通过其基类变量接见叫的方式毫无疑问也是可以的,纵然将叫的方式设置为私有的,由于在其基类内部

public void AnimalMethod(Animal animal) {
    animal.Shout();
}

若我们在子类Tiger中再界说一个方式,将Tiger作为变量通报进去,此时也是可以接见基类的叫方式

public void tigerMethod1(Tiger tiger) {
    tiger.Shout();
}

已经枚举如上诸多情形,那是不是就说明在子类中一定能接见到叫方式呢?固然不是,如下两种情形则是无效的,会泛起编译错误。

当在基类包外直接引用基类变量接见无效

我们在子类中再界说一个方式,直接引用基类的变量,然后接见叫方式,此时将无效。由于protected具有包接见权限,使得直接接见基类受珍爱成员变为私有或者说直接引用基类变量,无法判断其类型,由于可能在运行时是基类中的其他子类型,这么讲是否会更稳健一点。

public void tigerMethod2(Animal animal)
{
    //发生编译错误
    animal.Shout();
}

当在子类包中的非子类直接引用子类变量接见无效

我们在子类所在包中再界说一个类,然后引用子类变量接见叫方式,此时将无效。由于子类从其基类继续受珍爱的成员,此时会使它们对非子类私有:

package com.company1;

public class Tiger1 {
    public  void  tiger1Method(Tiger tiger){
        //发生编译错误
        tiger.Shout();
    }
} 

总结

网上有一部分文章对protected的总结是:本包任何类以及实现该类的子类(不管子类是否在本包中照样其他包中),这种说法不能说错误,只能说意思对照隐晦,由于直接读这段话可能就只思量了在子类中通过子类实例或直接通过关键字super挪用基类的受珍爱的成员,而可能会欠缺对非子类和直接通过基类引用受珍爱的成员的思量。 protected修饰符无论是Java亦或是C#具有两层观点接见权限的组合,一是基于程序集(C#)、包(Java)权限、二是继续权限。以是对于Java的protected接见权限可总结为:本包任何类以及实现该类的子类,无论子类位于本包照样差别包,但对基类外部包直接接见私有,同时对外部包中非子类私有。

,

联博开奖

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

Allbet内容转载自互联网,如有侵权,联系Allbet删除。

本文链接地址:http://www.chongqichengbaotoy.com/post/1322.html

相关文章

发表评论