首页 > 编程语言 >Java——访问修饰符

Java——访问修饰符

时间:2024-06-21 18:28:20浏览次数:12  
标签:包中 Java 子类 修饰符 Example 访问 com public

一、访问修饰符是什么

Java中的访问修饰符用于控制类、接口、构造函数、方法和数据成员(字段)的可见性和访问级别。

Java提供了四种访问修饰符:

访问修饰符同一类内同一包内不同包的子类不同包的非子类适用对象
public可见可见可见可见类、接口、变量、方法
protected可见可见可见不可见变量、方法
默认可见可见不可见不可见类、接口、变量、方法
private可见不可见不可见不可见变量、方法

二、访问修饰符详细介绍

对于访问修饰符修饰变量和修饰方法(包括构造器)的可访问情况都是一致的,我们下面以每个访问修饰符修饰成员变量作为例子。

1、public

  • 访问权限:最高,可以被任何其他类访问。
  • 适用范围:类、接口、构造器、方法和字段。

com.pack2 包中:

package com.pack2;

public class Example {

	//public 修饰字段(成员变量),以此为例
	public int publicVar;

	public void example() {
		System.out.println(publicVar);//同一个类中可以访问 publicVar
	}
}
package com.pack2;

public class SamePackage {
	public Example e = new Example();

	public void show() {
		System.out.println(e.publicVar);//可以在同一个包中被访问 publicVar
	}
}

这里可以看到同一类中可以访问 public 修饰的成员变量,同一个包中可以访问 public 修饰的成员变量。 

com.pcak1 包中:

package com.pack1;

import com.pack2.Example;

public class NotSamePackNotSubclass {
	public static void main(String[] args) {
		Example e1 = new Example();
		System.out.println(e1.publicVar);//在不同包的非子类中访问 publicVar
	}
}
package com.pack1;

import com.pack2.Example;

public class Subclass extends Example {

	public void foo() {
		System.out.println(publicVar);//在不同包的子类中访问 publicVar
	}
}

这里可以看到在不同包的非子类和子类中都可以访问到 public 修饰的成员变量。

2、protected

  • 访问权限:可以被同一个包中的任何类访问,以及不同包中的子类访问。不能被不同包的非子类访问。
  • 适用范围:构造函数、方法和字段。

com.pack2 包中:

package com.pack2;

public class Example {
	//protected 修饰的成员变量
	protected int protectedVar;
	
	public void show() {
		System.out.println(protectedVar);//同一个类中可以访问 protectedVar
	}
}
package com.pack2;

public class SamePackage {
	Example example = new Example();

	public void show() {
		System.out.println(example.protectedVar);//同一个包中可以访问 protectedVar
	}
}

可以看到这里 protected 修饰的成员变量可以在同一个类中和同一个包中访问。

com.pcak1 包中:

package com.pack1;

import com.pack2.Example;

public class NotSamePackNotSubclass {
    public static void main(String[] args) {
        Example example = new Example();
        //System.out.println(example.protectedVar);//不同包的非子类不能访问 protectedVar
        //这里会报错
    }
}

可以发现这里 protected 修饰的成员变量不能在不同包的非子类中访问。这里会报以下错:

但是在子类中就可以访问,就像下面:

package com.pack1;

import com.pack2.Example;

public class Subclass extends Example{
	public void show() {
		System.out.println(protectedVar);//不同包的子类可以访问 protectedVar
	}
}

可以发现 protected 修饰的成员变量可以在不同包的子类中被访问。

3、默认(没有访问修饰符)

  • 访问权限:可以被同一个包中的任何类访问,但不能被不同包中的类访问。
  • 适用范围:类、接口、构造函数、方法和字段。

com.pack2 包中:

package com.pack2;

public class Example {
	//无修饰(默认)的成员变量
	int defaultVar;

	public void show() {
		System.out.println(defaultVar);//同一个类中可以访问 defaultVar
	}
}
package com.pack2;

public class SamePackage {
	Example example = new Example();

	public void show() {
		System.out.println(example.defaultVar);//同一个包中可以访问 defaultVar
	}
}

可以发现默认的访问权限(没有访问修饰符)的成员变量可以在同一个类中访问,也可以在同一个包中访问。

com.pcak1 包中:

package com.pack1;

import com.pack2.Example;

public class NotSamePackNotSubclass {
	public static void main(String[] args) {
		Example example = new Example();
		//System.out.println(example.defaultVar);//不同包的非子类不能访问 defaultVar
		//这里会报错
	}
}

可以发现默认访问权限(没有访问修饰符)的成员变量不能在不同包的非子类中访问。这里会报错:

package com.pack1;

import com.pack2.Example;

public class Subclass extends Example{
	public void show() {
		//System.out.println(defaultVar);//不同包的子类不能访问 defaultVar
		//这里会报错
	}
}

可以发现默认访问权限(没有访问修饰符)的成员变量不能在不同包的子类中访问。这里会报错:

4、private

  • 访问权限:最低,只能被定义它的类内部访问。
  • 适用范围:构造函数、方法和字段。

com.pack2 包中:

package com.pack2;

public class Example {
	//private 修饰的成员变量
	private int privateVar;

	public void show() {
		System.out.println(privateVar);//同一个类中可以访问 privateVar
	}
}

可以发现 private 修饰的成员变量只能在同一个类中被访问。

package com.pack2;

public class SamePackage {
	Example example = new Example();

	public void show() {
		//System.out.println(example.privateVar);//同一个包中不能访问 privateVar
		//这里会报错
	}
}

可以发现 private 修饰的成员变量不能在同一个包中被访问。这里会报错:

com.pcak1 包中:

package com.pack1;

import com.pack2.Example;

public class NotSamePackNotSubclass {
	public static void main(String[] args) {
		Example example = new Example();
		//System.out.println(example.privateVar);//不同包的非子类不能访问 privateVar
		//这里会报错
	}
}

可以发现 private 修饰的成员变量不能在不同包的非子类中被访问。这里会报错:

package com.pack1;

import com.pack2.Example;

public class Subclass extends Example{
	public void show() {
		//System.out.println(privateVar);//不同包的子类不能访问 privateVar
		//这里会报错
	}
}

可以发现 private 修饰的成员变量不能在不同包的子类中被访问。这里会报错:

三、补充

1、适用范围

我们在文章最开始就给出了这个表格:

这里标出了这四个访问修饰符的适用对象。

对于 public 默认(什么都不写)是适用于类、接口、成员变量和成员方法的。

但是对于 protected private 是只能用于成员变量和成员方法的,不能用于类和接口。

标签:包中,Java,子类,修饰符,Example,访问,com,public
From: https://blog.csdn.net/stewie6/article/details/139863288

相关文章

  • Java-英语字符串进行单词分割
    (摘自头歌)任务描述将一段英语字符串进行单词分割。相关知识需要掌握:如何将字符串进行分割。String.split()拆分字符串lang包String类的split()方法publicString[]split(Stringregex)publicString[]split(Stringregex,intlimit)//limit参数控制模式应用的次数,因......
  • java面向对象三大特征
     免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动1.Java面向对象三大特征Java面向对象编程有三大特征:封装、继承、多态1.1封装封装(encapsulation)就是把抽象出的数据【属性】......
  • 解决uniapp h5 本地代理实现跨域访问及如何配置开发环境
    ......
  • java微信公众平台----带参数二维码生成和扫描事件
    功能是在详情页面点击按钮,生成二维码。打开微信扫码,扫码之后手机跳转到公众号并发送一条模板消息。点击模板消息,跳转到H5的详情页面。参考推荐:https://blog.csdn.net/weixin_42720002/category_8977300.html官方文档:https://developers.weixin.qq.com/doc/offiaccount/Account_Ma......
  • Java基础:throw和throws的详解
    总结来说,throw是用来抛出一个具体的异常实例,而throws是用来声明方法可能会抛出哪些类型的异常,是对调用者的一种通知和要求。1.throw作用:throw关键字用于在方法体内实际抛出一个异常实例。当程序运行到throw语句时,指定的异常会被创建并抛出,立即终止当前方法的执行,并将控制权......
  • 一文读懂Java线程池之自定义线程池、设置合适的线程数量、线程池阻塞队列、线程拒绝策
    在上篇我们学习了线程池各个参数的含义,线程池任务处理流程,使用线程池的好处等内容,本篇我们学习如何创建一个适合我们业务的线程池。为此,我们有必要先学习一下如何大概确定我们线程池核心线程数、怎么设置阻塞队列的类型与大小、当线程池没有能力处理任务了该如何使用拒绝策略等......
  • Java入门指南:大一新生的编程初体验
    引言作为一名大一新生,踏入编程世界可能会让人感到既兴奋又有些忐忑。Java作为一种广泛使用的编程语言,以其强大的功能和跨平台的特性,成为了许多计算机科学课程的首选。本文将带你一起走进Java的世界,分享一些入门的知识和学习经验,希望对刚开始学习Java的你有所帮助。1.为什么......
  • 一文读懂Java线程安全
    什么是线程安全性《JavaConcurrencyInPractice》对线程安全的定义如下:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不作其他的协调,这个类的行为仍是正确的,那么称这个类是线程安全的。简单理解就是,多......
  • 一文读懂Java多线程并发之内存模型
     什么是内存模型?Java内存模型(JavaMemoryModel)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个JVM的实现来遵守JMM规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚拟机上运行......
  • JavaScript状态数据
    最近需要做一个三维场景切换的功能,切换场景后,还可以进行二三维模式的切换,二三维切换时,要定位到当前场景视角,那么场景的视角参数信息就需要保存到状态数据中,以供二三维场景切换时使用。项目是用vue做的,这里并没有使用vue的状态管理库,我是这样实现的:定义状态数据sceneInfolets......