zoukankan      html  css  js  c++  java
  • 章节五、2-Package包和权限修饰符

    一、Package包

    为了更好的组织类,java提供了包机制,用于区别类名的命名空间。

    包的作用:

    1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

    2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名以此来区别。因此,包可以避免名字冲突。

    3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

    java中使用包这种机制是为了防止命名冲突,访问控制,提供搜索和定位类、接口、枚举、和注释等。

    二、在eclipse中怎么创建包

    找到需要创建包的java项目---》右键选择new---》Package---》给包命名(命名规则回顾第二章)---》finish

    此处创建一个名为automibile的包:

    然后我们introduction7包中创建一个BMW的类(每个类中的第一行都注明了该类所属包名):

    三、权限修饰符

    作用:用于控制被修饰变量、方法、类的可见范围。

    public访问级别最高,起次是protected、默认、私有。

    1、将前面(以前的章节)创建的Cars类和BMW类移动到automibile包中

    2、在新建的automibile包中创建一个名为AccessModifierDome的类,在该类中new一个Cars对象,new完后可能会报错,这是因为在上一节中演示继承时在构造方法中添加了一个参数,所以此处必须在Cars类中写一个默认无参的构造函数(如果未出现此问题可以忽略):

    3、默认:new了一个Cars对象后,调用Cars类中的变量speed,该变量权限修饰符为默认的,因为在同一个包中所以能够调用成功。(你们可以将该类移到到其它包中然后再调用该变量,会发现程序报错,出现此原因是因为变量的默认权限只能在同一个包中才能被访问,如果跨包访问,程序就会报错)

    4、私有:在Cars类中重新声明一个整形变量,权限为私有

    package automibile;
    
    public class Cars {
        int speed;
        private int privateSpeed;
        public Cars() {
            this(0);
        }
        //创建一个构造方法
        public Cars(int startSpeed) {
            speed = startSpeed;
        }
        
        //创建一个名为increaseSpeed的方法
        public void increaseSpeed() {
            speed++;
            System.out.println("cars 类的加速。。。");
        }
        
        //创建一个名为idcreaseSpeed的方法
        public void idecreaseSpeed() {
            speed--;
            System.out.println("cars 类的减速。。。");
        }
    }

    然后我们去AccessModifierDome类中调用这个变量,显示调用不成功,程序报错,因为被private修饰的变量只能在同一个类中被访问,

    如果需要对提供访问,可以使用get和set方法,在Cars类中添加如下代码:

    package automibile;
    
    import java.util.Set;
    
    public class Cars {
        int speed;
        private int privateSpeed;
        public Cars() {
            this(0);
        }
        public void setprivateSpeed(int privateSpeed) {
            this.privateSpeed = privateSpeed;
        }
        
        public int getprivateSpeed() {
            return privateSpeed;
        }
    
        //创建一个构造方法
        public Cars(int startSpeed) {
            speed = startSpeed;
        }
        
        //创建一个名为increaseSpeed的方法
        public void increaseSpeed() {
            speed++;
            System.out.println("cars 类的加速。。。");
        }
        
        //创建一个名为idcreaseSpeed的方法
        public void idecreaseSpeed() {
            speed--;
            System.out.println("cars 类的减速。。。");
        }
    }

    在AccessModifierDome类中调用:

    package automibile;
    
    public class AccessModifierDome {
    
        public static void main(String[] args) {
            Cars c1 = new Cars();
            c1.speed = 10;
            c1.setprivateSpeed(20);
            System.out.println(c1.getprivateSpeed());
        }
        
    }

    打印结果为:20

    5、public公共权限:只要导入了这个包和这个类,在任何其它类中均能访问。

    6、protected受保护权限:在Cars中定义一个该类型的变量,将decreaseSpeed方法权限改为私有权限,

    我们先在同一个包中的AccessModifierDome类调用,查看是否能调用成功,

     

    然后我们打开包名为introduction7中的InheritanceDemo类,然后调用Cars类中的变量和方法,查看调用是否成功,

    接下来我们在继承了Cars类的BMW类中调用(Cars类和BMW在同一个包中),通过实例化和直接调用两种方式查看调用是否成功,

    然后我们在同样继承了Cars的Demo类中(Demo属于包名为introduction7中),通过同样的两种方式查看调用是否成功,

    总结:受保护权限的变量或只有以下几种方式能被成功调用

    1、同包同类

    2、同包不同类

    3、同包不同类时,调用者和非调用者存在继承关系时,只能直接访问,不能在实例化对象后访问

  • 相关阅读:
    HFish 源码Git下载 源码编译执行
    Windows注册表-学习总结
    利用PHPStudy搭建Xdebug调试环境
    Python3报错Crypto失败(from Crypto.Cipher import AES ModuleNotFoundError: No module named 'Crypto')
    Django后台管理admin字段控制显示长度(字段内容过长,省略号替代)
    PHP代码审计-小题一道
    golang编程-小问题
    迅雷影音播放器-ass字幕乱码-问题
    《独自等待》观影有感
    Python urllib URL 处理模块
  • 原文地址:https://www.cnblogs.com/luohuasheng/p/9543640.html
Copyright © 2011-2022 走看看