首页 > 编程语言 >Java访问权限之public、protected、private详解——【包和访问控制】【访问权限控制】

Java访问权限之public、protected、private详解——【包和访问控制】【访问权限控制】

时间:2024-02-28 22:36:50浏览次数:26  
标签:java String 访问 import Java 权限 com public

@

目录


源码:
Gitee https://gitee.com/drip123456/java-se
GIthub https://github.com/Drip123456/JavaSE

专栏: JavaSE笔记专栏

包和访问控制

通过前面的学习,我们知道该如何创建和使用类。

包声明和导入

包其实就是用来区分类位置的东西,也可以用来将我们的类进行分类(类似于C++中的namespace)随着我们的程序不断变大,可能会创建各种各样的类,他们可能会做不同的事情,那么这些类如果都放在一起的话,有点混乱,我们可以通过包的形式将这些类进行分类存放。

包的命名规则同样是英文和数字的组合,最好是一个域名的格式,比如我们经常访问的www.baidu.com,后面的baidu.com就是域名,我们的包就可以命名为com.baidu,当然,各位小伙伴现在还没有自己的域名,所以说我们随便起一个名称就可以了。其中的.就是用于分割的,对应多个文件夹,比如com.test

在这里插入图片描述

我们可以将类放入到包中:
在这里插入图片描述

我们之前都是直接创建的类,所以说没有包这个概念,但是现在,我们将类放到包中,就需要注意了:

package com.test;   //在放入包中,需要在类的最上面添加package关键字来指明当前类所处的包

public class Main {   //将Main类放到com.test这个包中
    public static void main(String[] args) {

    }
}

这里又是一个新的关键字package,这个是用于指定当前类所处的包的,注意,所处的包和对应的目录是一一对应的。

不同的类可以放在不同的包下:

当我们使用同一个包中的类时,直接使用即可(之前就是直接使用的,因为都直接在一个缺省的包中)而当我们需要使用其他包中的类时,需要先进行导入才可以:

package com.test;

import com.test.entity.Person;   //使用import关键字导入其他包中的类

public class Main {
    public static void main(String[] args) {
        Person person = new Person();   //只有导入之后才可以使用,否则编译器不知道这个类从哪来的
    }
}

这里使用了import关键字导入我们需要使用的类,当然,只有在类不在同一个包下时才需要进行导入,如果一个包中有多个类,我们可以使用*表示导入这个包中全部的类:

import com.test.entity.*;

实际上我们之前一直在使用的System类,也是在一个包中的:

package java.lang;

import java.io.*;
import java.lang.reflect.Executable;
import java.lang.annotation.Annotation;
import java.security.AccessControlContext;
import java.util.Properties;
import java.util.PropertyPermission;
import java.util.StringTokenizer;
import java.util.Map;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.AllPermission;
import java.nio.channels.Channel;
import java.nio.channels.spi.SelectorProvider;
import sun.nio.ch.Interruptible;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;
import sun.security.util.SecurityConstants;
import sun.reflect.annotation.AnnotationType;

import jdk.internal.util.StaticProperty;

/**
 * The <code>System</code> class contains several useful class fields
 * and methods. It cannot be instantiated.
 *
 * <p>Among the facilities provided by the <code>System</code> class
 * are standard input, standard output, and error output streams;
 * access to externally defined properties and environment
 * variables; a means of loading files and libraries; and a utility
 * method for quickly copying a portion of an array.
 *
 * @author  unascribed
 * @since   JDK1.0
 */
public final class System {
	  ...
}

可以看到它是属于java.lang这个包下的类,并且这个类也导入了很多其他包中的类在进行使用。那么,为什么我们在使用这个类时,没有导入呢?实际上Java中会默认导入java.lang这个包下的所有类,因此我们不需要手动指定。

IDEA非常智能,我们在使用项目中定义的类时,会自动帮我们将导入补全,所以说代码写起来非常高效。

注意,在不同包下的类,即使类名相同,也是不同的两个类:

package com.test.entity;

public class String {    //我们在自己的包中也建一个名为String的类
}

当我们在使用时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于默认导入了系统自带的String类,并且也导入了我们自己定义的String类,那么此时就出现了歧义,编译器不知道到底我们想用的是哪一个String类,所以说我们需要明确指定:

public class Main {
    public static void main(java.lang.String[] args) {   //主方法的String参数是java.lang包下的,我们需要明确指定一下,只需要在类名前面添加包名就行了
				com.test.entity.String string = new com.test.entity.String();
    }
}

我们只需要在类名前面把完整的包名也给写上,就可以表示这个是哪一个包里的类了,当然,如果没有出现歧义,默认情况下包名是可以省略的,可写可不写。

可能各位小伙伴会发现一个问题,为什么对象的属性访问不了了?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编译器说name属性在这个类中不是public,无法在外部进行访问,这是什么情况呢?这里我们就要介绍的到Java的访问权限控制了。

访问权限控制

实际上Java中是有访问权限控制的,就是我们个人的隐私的一样,我不允许别人随便来查看我们的隐私,只有我们自己同意的情况下,才能告诉别人我们的名字、年龄等隐私信息。

所以说Java中引入了访问权限控制(可见性),我们可以为成员变量、成员方法、静态变量、静态方法甚至是类指定访问权限,不同的访问权限,有着不同程度的访问限制:

  • private - 私有,标记为私有的内容无法被除当前类以外的任何位置访问。
  • 什么都不写 - 默认,默认情况下,只能被类本身和同包中的其他类访问。
  • protected - 受保护,标记为受保护的内容可以能被类本身和同包中的其他类访问,也可以被子类访问(子类我们会在下一章介绍)
  • public - 公共,标记为公共的内容,允许在任何地方被访问。

这四种访问权限,总结如下表:

当前类 同一个包下的类 不同包下的子类 不同包下的类
public
protected
默认
private

比如我们刚刚出现的情况,就是因为是默认的访问权限,所以说在当前包以外的其他包中无法访问,但是我们可以提升它的访问权限,来使得外部也可以访问:

public class Person {
    public String name;   //在name变量前添加public关键字,将其可见性提升为公共等级
    int age;
    String sex;
}

这样我们就可以在外部正常使用这个属性了:

public static void main(String[] args) {
    Person person = new Person();
    System.out.println(person.name);   //正常访问到成员变量
}

实际上如果各位小伙伴观察仔细的话,会发现我们创建出来的类自带的访问等级就是public

package com.test.entity;

public class Person {   //class前面有public关键字

}

也就是说这个类实际上可以在任何地方使用,但是我们也可以将其修改为默认的访问等级:

package com.test.entity;

class Person {    //去掉public变成默认等级
  
}

如果是默认等级的话,那么在外部同样是无法访问的:

-1706281443731)

但是注意,我们创建的普通类不能是protected或是private权限,因为我们目前所使用的普通类要么就是只给当前的包内使用,要么就是给外面都用,如果是private谁都不能用,那这个类定义出来干嘛呢?

如果某个类中存在静态方法或是静态变量,那么我们可以通过静态导入的方式将其中的静态方法或是静态变量直接导入使用,但是同样需要有访问权限的情况下才可以:

public class Person {
    String name;
    int age;
    String sex;
    
    public static void test(){
        System.out.println("我是静态方法!");
    }
}

我们来尝试一下静态导入:

import static com.test.entity.Person.test;    //静态导入test方法

public class Main {
    public static void main(String[] args) {
        test();    //直接使用就可以,就像在这个类定义的方法一样
    }
}

至此,有关包相关的内容,我们就讲解到这里。

标签:java,String,访问,import,Java,权限,com,public
From: https://www.cnblogs.com/drip3775/p/18042147

相关文章

  • k8s是如何保障滚动升级时下线的pod不被访问
    Kubernetes(k8s)通过一系列机制保障在滚动升级时,下线的Pod不再被访问。以下是一些主要的保障措施:Service抽象:在Kubernetes中,Pod通常不是直接暴露给外部访问的,而是通过Service来抽象和暴露。Service提供一个稳定的网络端点,无论背后的Pod如何变化,Service的IP和端......
  • xlua - c#访问lua函数
    lua代码Assets/Lua/Test1.lua.txtfunctionIntParam(p)print("~~~~~IntParam")print(type(p),p)print("~~~~~")returnpendfunctionVec3Param(p)print("~~~~~Vec3Param")print(type(p),p.x,p.y,p.z)......
  • centos中无法访问外网排除点
    1,查看网卡信息一般在Centos中网卡所在位置是/etc/sysconfig/network-scripts/目录下,找到对应网卡查看即可2,查看防火墙信息查看防火墙状态firewall-cmd--state如果防火墙状态是runing,则建议关闭systemctlstopfirewalld,永久关闭开机不启动systemctldisablefirewalld......
  • RHCE高级权限和文件系统
    一:高级用户组和用户权限1:密码策略1:含义密码策略就是设置密码的一些属性,如什么时候密码过期等修改的就是这个配置文件/etc/shadow这里面的参数user2:!!:19768:0:99999:7:::第一个字段:用户名第二个字段:密码占位符,!!表示没有密码,!表示密码被锁定了,*有密码第三个字段:1970年1......
  • java中的break与continue
    breakbreak:打破结束终止注意事项:1、break不能单独使用,毫无意义2、要在switch语句或者循环语句中使用packagecom.shujia.day03;publicclassBreakDemo{publicstaticvoidmain(String[]args){//需求:循环输出1-5当i为3的时候,使用break......
  • JAVA基础:数组常见案例
    1.数组找最值packagecom.itheima.arry;publicclassArrayDemo7{publicstaticvoidmain(String[]args){//掌握数组元素求最值int[]faceScore={15,9000,10000,20000,9500,-5};intmax=faceScore[0];for(inti=1;i<faceS......
  • Java 包和 API 深度解析:组织代码,避免命名冲突
    Java包和APIJava中的包用于将相关的类分组在一起。可以将其视为文件目录中的一个文件夹。我们使用包来避免名称冲突,并编写更易于维护的代码。包分为两类:内置包(来自JavaAPI的包)用户定义的包(创建自己的包)内置包JavaAPI是一个预先编写的类库,可以在Java开发环境中......
  • JAVA基础:数组在计算机中的执行原理 多个变量指向一个数组
    程序都是在计算机中的内存中执行的,java程序编译之后会产生一个class文件,这个class文件是提取到内存中的JVM虚拟机中执行的。java为了便于虚拟机这个java程序,也即这个class文件。将虚拟机这块内存区域进行了划分:方法区,栈,堆,  本地方法栈,程序计数器方法区:放编译后的class文件的......
  • Java_常见报错&解决
    平时Java开发中常见的报错:SQLExceptionSQL异常,常见于操作数据库时的SQL语句错误。404错误:这是常见的页面不存在错误,建议仔细核查显示的网页是否存在(在运行的浏览器地址框中仔细查看当前路径,核实该路径是否正确,是否有路径错误,当前网页名字名字错误,使用了相对路径导致跳转出......
  • java启动参考
    启动参数 mvncleanpackage-Dmaven.test.skip=true-Ptest-java--server--Xms2G--Xmx2G--Xss256K--XX:+UseConcMarkSweepGC--XX:CMSFullGCsBeforeCompaction=5......