java 修饰_Java 修饰符

摘录自http://www.runoob.com/java/java-modifier-types.html

Java 修饰符

Java语言提供了很多修饰符,主要分为以下两类:

访问修饰符

非访问修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:

publicclassclassName {// ...}privatebooleanmyFlag;staticfinaldoubleweeks =9.5;protectedstaticfinalintBOXWIDTH =42;publicstaticvoidmain(String[]arguments){// 方法体}

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。

默认的,也称为 default,在同一包内可见,不使用任何修饰符。

私有的,以 private 修饰符指定,在同一类内可见。

共有的,以 public 修饰符指定,对所有类可见。

受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。

默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public。

实例:

如下例所示,变量和方法的声明可以不使用任何修饰符。

Stringversion ="1.5.1";booleanprocessOrder(){returntrue;}

私有访问修饰符-private

私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。

声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问。

Private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。

下面的类使用了私有访问修饰符:

publicclassLogger{privateStringformat;publicStringgetFormat(){returnthis.format;}publicvoidsetFormat(Stringformat){this.format =format;}}

实例中,Logger类中的format变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个public方法:getFormat() (返回format的值)和setFormat(String)(设置format的值)

公有访问修饰符-public

被声明为public的类、方法、构造方法和接口能够被任何其他类访问。

如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。

以下函数使用了公有访问控制:

publicstaticvoidmain(String[]arguments){// ...}

Java程序的main() 方法必须设置成公有的,否则,Java解释器将不能运行该类。

受保护的访问修饰符-protected

被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。

Protected访问修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量和成员方法不能声明为protected。

子类能访问Protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。

下面的父类使用了protected访问修饰符,子类重载了父类的openSpeaker()方法。

classAudioPlayer{protectedbooleanopenSpeaker(Speakersp){// 实现细节}}classStreamingAudioPlayer{booleanopenSpeaker(Speakersp){// 实现细节}}

如果把openSpeaker()方法声明为private,那么除了AudioPlayer之外的类将不能访问该方法。如果把openSpeaker()声明为public,那么所有的类都能够访问该方法。如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。

访问控制和继承

请注意以下方法继承的规则:(父类为整体约束,子类不能比父类更严格)

父类中声明为public的方法在子类中也必须为public。

父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。

父类中声明为private的方法,不能够被继承。

非访问修饰符

为了实现一些其他的功能,Java也提供了许多非访问修饰符。

static修饰符,用来创建类方法和类变量。

Final修饰符,用来修饰类、方法和变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

Abstract修饰符,用来创建抽象类和抽象方法。

Synchronized和volatile修饰符,主要用于线程的编程。

Static修饰符

静态变量:

Static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被成为类变量。局部变量不能被声明为static变量。

静态方法:

Static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量(因为静态方法可以不用创建对象就调用,非静态方法必须有了对象的实例才能调用)。静态方法从参数列表得到数据,然后计算这些数据。

只要记住:

用statci修饰的成员是属于类的,在static的方法里可以用类名直接调用;

不用statci修饰的成员是属于具体实例对象的,需要用对象名调用,且在static的方法里不可以调用。

因为静态方法的调用不是通过实例对象进行的,所以在静态方法中没有this指针,不能访问所属类的非静态变量和方法,只能访问方法体内的局部变量、自己的参数和静态变量。所以你在在static的主函数里调用非static的方法时肯定报错。

对类变量和方法的访问可以直接使用classname.variablename和classname.methodname的方式访问。

如下例所示,static修饰符用来创建类方法和类变量。

publicclassInstanceCounter{privatestaticintnumInstances =0;protectedstaticintgetCount(){returnnumInstances;}privatestaticvoidaddInstance(){numInstances++;}InstanceCounter(){InstanceCounter.addInstance();}publicstaticvoidmain(String[]arguments){System.out.println("Starting with "+InstanceCounter.getCount()+" instances");for(inti =0;i <500;++i){newInstanceCounter();}System.out.println("Created "+InstanceCounter.getCount()+" instances");}}

以上实例运行编辑结果如下:

Startedwith0instances

Created500instances

Final修饰符

Final变量:

Final变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。

Final修饰符通常和static修饰符一起使用来创建类常量。

实例:

publicclassTest{finalintvalue =10;// 下面是声明常量的实例publicstaticfinalintBOXWIDTH =6;staticfinalStringTITLE ="Manager";publicvoidchangeValue(){value =12;//将输出一个错误}}

Final方法

类中的Final方法可以被子类继承,但是不能被子类修改。

声明final方法的主要目的是防止该方法的内容被修改。

如下所示,使用final修饰符声明方法。

publicclassTest{publicfinalvoidchangeName(){// 方法体}}

Final类

Final类不能被继承,没有类能够继承final类的任何特性。

实例:

publicfinalclassTest{// 类体}

Abstract修饰符

抽象类:

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被abstract和final修饰(abstract是抽象类,指定必须要子类继承才可以使用,而final是指定不允许继承)。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象类可以包含抽象方法和非抽象方法。

实例:

abstractclassCaravan{privatedoubleprice;privateStringmodel;privateStringyear;publicabstractvoidgoFast();//抽象方法publicabstractvoidchangeColor();}

抽象方法

抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。抽象方法不能被声明成final(因为类中的Final方法可以被子类继承,但是不能被子类修改)和strict。

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

抽象方法的声明以分号结尾,例如:public abstract sample();

实例:

publicabstractclassSuperClass{abstractvoidm();//抽象方法}classSubClassextendsSuperClass{//实现抽象方法voidm(){.........}}

Synchronized修饰符

Synchronized关键字声明的方法同一时间只能被一个线程访问。Synchronized修饰符可以应用于四个访问修饰符。

实例:

publicsynchronizedvoidshowDetails(){.......}

Transient修饰符

序列化的对象包含被transient修饰的实例变量时,java虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

实例:

publictransientintlimit =55;// will not persistpublicintb;// will persist

Volatile修饰符

Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

一个volatile对象引用可能是null。

实例:

publicclassMyRunnableimplementsRunnable{privatevolatilebooleanactive;publicvoidrun(){active =true;while(active)// 第一行{// 代码}}publicvoidstop(){active =false;// 第二行}}

通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。

但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存分配,任意字节对齐

有这么一道题目&#xff0c;要求按任意字节对齐分配内存&#xff0c;接口&#xff1a;char * aligned_malloc(int size, int alignment)//size 为分配的内存大小&#xff0c;alignment对齐基数&#xff08;可以为任意数&#xff09;这个在gcc库函数里能找到源码&#xff0c;在f…

day16-Dom提交表单以及其他

一、前言 之前我们学习的是from提交表单&#xff0c;那个是html的提交表单方式&#xff0c;现在我们用dom来提交表单&#xff0c;还有一些其他的方式 二、dom提交表单 2.1、html提交表单 说明&#xff1a;form标签跟submit类型的input标签结合 <body><form id"f1…

分布式文件系统FastDFS

1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制&#xff0c; 充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件…

html5 下拉刷新(pc+移动网页源码)

本文demo下载地址&#xff1a;http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1071 本文实现在html5网页中使用下拉功能自动刷新显示更多内容, 使用jquery捕捉和处理相应的鼠标事件, 例如内容在顶部时&#xff0c;触发下拉事件后显示更多内容; 如内容在…

操作系统内存管理问题集锦

1. 可采用哪几种方式将程序装入内存?它们分别适用于何种场合? a. 首先由编译程序将用户源代码编译成若干目标模块&#xff0c;再由链接程序将编译后形成的目标模块和所需的-库函数链接在一起&#xff0c;组成一个装入模块&#xff0c;再由装入程序将装入模块装入内存&#x…

java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...

首先我们在new 一个对象的时候&#xff0c;对象的id是唯一确定的&#xff1b;将对象add入list中时&#xff0c;放入list中的其实是对象的引用 &#xff1b;而每次循环只是简单的set 对象的属性&#xff0c;set新的属性值&#xff0c;而add进list中的对象还是同一个对象id&#…

python面试题总结(1)--语言特性

1. 谈谈对 Python 和其他语言的区别 答&#xff1a; Python 是一门强类型的可移植、可扩展、可嵌入的解释型编程语言&#xff0c;属于动态语言&#xff1b;其语法简洁优美、功能强大无比、应用领域非常广泛且具有强大完备的第三方库。 &#xff08;注&#xff1a;语言有无类型…

视频网站盈利模式与营销策划

在与数十家视频网站进行信息网络传播权交易过程中&#xff0c;在研究视频网站内容和盈利模式基础上&#xff0c;综合自己在传统媒体和新媒体领域十几年的策划和营销经验&#xff0c;我发现&#xff1a;视频网站的盈利模式其实早就形成多种体系&#xff0c;但是盈利之路艰难&…

USACO 06JAN 牛的舞会 洛谷2863

题目描述 The N (2 < N < 10,000) cows are so excited: it’s prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round…

[UWP]了解模板化控件(4):TemplatePart

原文:[UWP]了解模板化控件(4)&#xff1a;TemplatePart1. TemplatePart TemplatePart&#xff08;部件&#xff09;是指ControlTemplate中的命名元素。控件逻辑预期这些部分存在于ControlTemplate中&#xff0c;并且使用protected DependencyObject GetTemplateChild(String ch…

动态重定位的增加的紧凑功能

动态重定位增加了紧凑的功能&#xff0c;在动态的分区分配时&#xff0c;可以对外部碎片进行紧凑来为没有内存空间进行存储的进程进行分配。

java 重载 equals_实现Student类的equals重载函数

[java]代码库//测试类public class StudentDemo {public static void main(String[] args) {Student s1 new Student("000","张三",18);Student s2 new Student("000","张三",18);//随便改boolean flag s1.equals(s2);System.out.p…

python面试题总结(2)--编码规范

1. 什么是 PEP8? 答&#xff1a;PEP8 --《Python Enhancement Proposal #8》&#xff08;8 号 Python 增强提案&#xff09;&#xff0c;他针对的 Python 代码格式而编订的风格指南。 2. 了解 Python 之禅么&#xff1f; 答&#xff1a;通过 import this 语句可以获取其具体…

【Unity热更新】学会AssetsBundle打包、加载、卸载

本教程详细讲解什么是AssetBundle压缩包机制!然后构建 AssetBundle、加载 AssetBundle 以及卸载 AssetBundle 的简要教程。这一个流程就是热更新! AssetBundles 简介 1.什么是AssetBundles? AssetBundles是Unity中一种用于打包和存储资源(如模型、纹理、声音等)的文件格…

Confluence 6 访问你的宏正文(body)

请查看 Writing User Macros 页面获得有关如何写用户宏的介绍。 这个页面介绍你可以在用户宏中可以使用的的代码信息。 访问你的宏正文&#xff08;body&#xff09; 在你用户宏模板中的 $body 对象可以访问访问到传递到你宏正文中的内容。 当你的宏有指定的正文的时候&#xf…

hibernate主键生成策略

1、hibernate 要求实体类里面有一个属性作为唯一值&#xff0c;对应的表字段是主键&#xff0c;主键可以不同的生成策略 2、hibernate 主键生成策略有很多的值 <generator class"native"></generator> 3、在class属性里面有很多值 &#xff08;1&#xf…

jboss mysql cluster_jboss配置mysql数据库连接池

jboss配置mysql数据库连接池下面YJBYS小编为大家整理了关于jboss配置mysql数据库连接池的文章&#xff0c;希望对你有所帮助。更多Java认证考试信息&#xff0c;尽在应届毕业生培训网!1&#xff1a;配置&#xff1a;JDK 1.5JBoss4.0.4Mysql5.0Myeclipse 4.12&#xff1a;建立数…

P2P-挑战和机遇

近年来互联网上对等连接P2P应用发展迅速&#xff0c;MP3和视频文件共享下载的P2P流已经成为宽带用户流量的主体。基于P2P的即时通信和互联网电话&#xff08;如Skype&#xff09;发展迅速&#xff0c;对等广播P2P流媒体等正在兴起。P2P协同计算和网格方兴未艾。P2P 应用支持网络…

python面试题总结(3)-- 数据类型(字符串)

1. 列举 Python 中的基本数据类型&#xff1f; 答&#xff1a; Python3 中有六个标准的数据类型&#xff1a;数字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#…