java修饰符的使用.docx
- 文档编号:23485909
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:20
- 大小:110.67KB
java修饰符的使用.docx
《java修饰符的使用.docx》由会员分享,可在线阅读,更多相关《java修饰符的使用.docx(20页珍藏版)》请在冰豆网上搜索。
java修饰符的使用
Java主要修饰符的使用
作者:
武汉理工大学计算机科学与技术学院软件工程1002班岳广
学号0121*****0212
1.基本介绍
1.1类的修饰符分为:
可访问控制符和非访问控制符两种。
可访问控制符是:
公共类修饰符public
非访问控制符有:
抽象类修饰符abstract;最终类修饰符final
1)公共类修饰符public:
Java语言中类的可访问控制符只有一个:
public即公共的。
每个Java程序的主类都必须是public类作为公共工具供其它类和程序使用的应定义为public类。
2)抽象类修饰符abstract:
凡是用abstract修饰符修饰的类,被称为抽象类。
所谓抽象类是指这种类没有具体对象的一种概念类。
这样的类就是Java语言的abstract类。
3)最终类修饰符final:
当一个类不可能有子类时可用修饰符final把它说明为最终类。
被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类。
4)类缺省访问控制符:
如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。
此时,这个类只能被同一个包中的类访问或引用。
这一访问特性又称为包访问性。
1.2域的控制修饰符也分为:
可访问控制符和非访问控制符两类。
可访问控制符有4种:
公共访问控制符:
public;私有访问控制符:
private;保护访问控制符:
protected;私有保护访问控制符:
privateprotected
非访问控制符有4种:
静态域修饰符:
static;最终域修饰符:
final;易失(共享)域修饰符:
volatile;暂时性域修饰符:
transient
1)公共访问控制符public:
用public修饰的域称为公共域。
如果公共域属于一个公共类,则可以被所有其它类所引用。
由于public修饰符会降低运行的安全性和数据的封装性,所以一般应减少public域的使用。
2)私有访问控制符private:
用private修饰的成员变量(域)只能被该类自身所访问,而不能被任何其它类(包括子类)所引用。
3)保护访问控制符protected:
用protected修饰的成员变量可以被三种类所引用:
①该类自身;②与它在同一个包中的其它类;③在其它包中的该类的子类。
使用修饰符protected的主要作用是允许其它包中它的子类来访问父类的特定属性。
4)私有保护访问控制符privateprotected:
用修饰符privateprotected修饰的成员变量可以被该类本身或该类的子类两种类访问和引用。
5)静态域修饰符static:
用static修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。
任何一个类的对象访问它时取到的都是相同的数据;任何一个类的对象修改它时,也都是对同一个内存单元进行操作。
6)最终域修饰符final:
最终域修饰符final是用来定义符号常量的。
一个类的域(成员变量)如果被修饰符final说明,则它的取值在程序的整个执行过程中都是不变的。
7)易失(共享)域修饰符volatile:
易失(共享)域修饰符volatile是用来说明这个成员变量可能被几个线程所控制和修改。
也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。
因此,在使用中要注意这种成员变量取值的变化。
通常volatile用来修饰接受外部输入的域。
8)暂时性域修饰符transient:
暂时性域修饰符transient用来定义一个暂时性变量。
其特点是:
用修饰符transient限定的暂时性变量,将指定Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。
否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。
1.3方法的控制修饰符也分为:
可访问控制符和非访问控制符两类。
可访问控制符有4种:
公共访问控制符:
public;私有访问控制符:
private;保护访问控制符:
protected;私有保护访问控制符:
privateprotected
非访问控制符有5种:
抽象方法控制符:
abstract;静态方法控制符:
static;最终方法控制符:
final;本地方法控制符:
native;同步方法控制符:
synchronized
1)抽象方法控制符abstract:
用修饰符abstract修饰的方法称为抽象方法。
抽象方法是一种仅有方法头,没有方法体和操作实现的一种方法。
2)静态方法控制符static:
用修饰符static修饰的方法称为静态方法。
静态方法是属于整个类的类方法;而不使用static修饰、限定的方法是属于某个具体类对象的方法。
由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即static方法只能处理static的域。
3)最终方法控制符final:
用修饰符final修饰的方法称为最终方法。
最终方法是功能和内部语句不能更改的方法,即最终方法不能重载。
这样,就固定了这个方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。
所有被private修饰符限定为私有的方法,以及所有包含在final类(最终类)中的方法,都被认为是最终方法。
4)本地方法控制符native:
用修饰符native修饰的方法称为本地方法。
为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符native来修饰;
5)同步方法控制符synchronized:
该修饰符主要用于多线程共存的程序中的协调和同步。
2.Java中各种修饰符与访问修饰符的说明
2.1类:
访问修饰符
名称
说明
备注
public
可以被所有类访问(使用)
public类必须定义在和类名相同的同名文件中
package
可以被同一个包中的类访问(使用)
默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中
修饰符
名称
说明
备注
final
使用此修饰符的类不能够被继承
abstract
如果要使用abstract类,之前必须首先建一个继承abstract类的新类,新类中实现abstract类中的抽象方法。
类只要有一个abstract方法,类就必须定义为abstract,但abstract类不一定非要保护abstract方法不可
2.2变量:
访问修饰符
名称
说明
备注
public
可以被任何类访问
protected
可以被同一包中的所有类访问
可以被所有子类访问
子类没有在同一包中也可以访问
private
只能够被当前类的方法访问
缺省
无访问修饰符
可以被同一包中的所有类访问
如果子类没有在同一个包中,也不能访问
修饰符
名称
说明
备注
static
静态变量(又称为类变量,其它的称为实例变量)
可以被类的所有实例共享。
并不需要创建类的实例就可以访问静态变量
final
常量,值只能够分配一次,不能更改
注意不要使用const,虽然它和C、C++中的const关键字含义一样
可以同static一起使用,避免对类的每个实例维护一个拷贝
transient
告诉编译器,在类对象序列化的时候,此变量不需要持久保存
主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题
volatile
指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理
2.3方法:
访问修饰符
名称
说明
备注
public
可以从所有类访问
protected
可以被同一包中的所有类访问
可以被所有子类访问
子类没有在同一包中也可以访问
private
只能够被当前类的方法访问
缺省
无访问修饰符
可以被同一包中的所有类访问
如果子类没有在同一个包中,也不能访问
修饰符
名称
说明
备注
static
静态方法(又称为类方法,其它的称为实例方法)
提供不依赖于类实例的服务
并不需要创建类的实例就可以访问静态方法
final
防止任何子类重载该方法
注意不要使用const,虽然它和C、C++中的const关键字含义一样
可以同static一起使用,避免对类的每个实例维护一个拷贝
abstract
抽象方法,类中已声明而没有实现的方法
不能将static方法、final方法或者类的构造器方法声明为abstract
native
用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用C、C++编写的。
参见Sun的JavaNative接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能
synchronized
多线程的支持
当一个此方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回
2.4接口:
访问修饰符
名称
说明
备注
public
所有
无访问修饰符(默认)
同一个包内
3.面向对象的特征
3.1抽象:
就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
抽象包括两个方面,一是过程抽象,二是数据抽象。
抽象方法是没有方法体的方法。
抽象方法有两种,一种是被abstract修饰的方法,一种是接口(被interface修饰的类)中的方法。
被abstract或interface被修饰的类都属于抽象类。
被abstract修饰的抽象类中可以有抽象方法,也可以没有抽象方法;可以有具体的方法(有方法体的方法),也可以没有具体的方法。
抽象方法必须存在抽象类中。
抽象类是不能被自身通过关键字new来实例化的。
3.2封装:
是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
说简单点封装就是将属性私有化(private),提供公有的方法访问私有属性。
每一个私有属性创建一对取值(get私有属性名)方法和赋值(set私有属性名)方法。
3.3方法的重载(Overload):
在同一个类中如果有几个方法名相同,但参数的类型、个数和顺序不一致时,这几个方法互为重载。
方法重载与访问修饰符和返回值类型无关。
3.4继承:
对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
子类类名后跟“extends要继承的父类类名”。
3.5多态性:
指允许不同类的对象对同一消息作出响应。
多态性包括参数化多态性和包含多态性。
4.示例
4.1publicprotecteddefaultprivate组
范围
private
default
protected
public
同一类
√
√
√
√
同一包中的类
√
√
√
不同包中的子类
√
√
其他包中的类
√
程序代码:
packagetest;
classPublicClass{
publicStringpublicVariable="publicVariable";
privateStringprivateVar="privatevar";
protectedStringprotectedVar="protectedvar";
StringdefaultVar="defaultVar";
privatevoidshowPrivate(){
System.out.println("Nobodywillaccess!
");
}
publicvoidshowPublic(){
System.out.println("showPublicmethod!
");
}
publicvoidshowProtected(){
System.out.println("Showprotectedmethod!
");
}
voidshowDefault(){
System.out.println("Showdefaultmethod!
");
}
}
packagetest;
classTest{
privateStringvar="privatevariableinclass-Test!
";
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Testt=newTest();
PublicClasspClass=newPublicClass();
//另外一个类中的共有属性和方法是可以被外界所访问的
System.out.println("可以访问到的资源属性:
"+pClass.publicVariable);//可访问
pClass.showPublic();//可访问
/*
*以下两条编译错误,在另外一个类中的私有方法是访问不到的
**/
//System.out.println("可以访问到的资源属性:
"+pClass.privateVariable);//不能访问
//pClass.showPrivate();//不能访问
//私有变量自己可以访问
System.out.println("私有变量自己可以访问"+t.var);
//protected成员可以被该类的成员和子类的成员访问。
//还可以被同一个包中内的其他类成员访问
System.out.println("可以访问到的资源属性:
"+pClass.protectedVar);//可访问
pClass.showProtected();//可访问
System.out.println("可以访问到的资源属性:
"+pClass.defaultVar);//可访问
pClass.showDefault();//可访问
}
}
运行截图:
4.2final修饰符
1)当final用于基本数据类型时,final让其值(value)保持不变,但是当用于objectreference时,final仅让reference保持不变。
程序代码:
publicclassTest{
/**
*@paramargs
*/
privatefinalintli_int=12;
privatefinalInClassinClass1=newInClass(5);
privatefinalInClassinClass2=newInClass(8);
publicvoidmodifiedFinal(inta){
//下面语句出现编译错误,不能修改final基本类型的值
//li_int=a;
//下面语句出现编译错误,不能将已经初始化的final变量指向另一个对象
//inClass1=inClass2;
//下面语句成功,虽然引用不能改变但final变量引用的对象本身内容是可以改变的
inClass1.mod(a);
}
classInClass{
intli_a=0;
publicInClass(inta){
li_a=a;
}
publicintmod(intb){
li_a=b;
returnli_a;
}
}
publicstaticvoidmain(Stringargs[]){
Testtest1=newTest();
test1.modifiedFinal(100);
System.out.println(test1.inClass1.li_a);
}
}
运行截图:
2)当声明参数为final时,可以保证该参数不能再被指向它处,当参数是基本数据类型时,就意味着值不能改变。
程序代码:
publicclassTest3{
/**
*@paramargs
*/
privateintli_int=12;
privateInClassinClass1=newInClass(5);
privateInClassinClass2=newInClass(8);
publicvoidmodifiedFinal(finalinta,finalInClassin){
//下面语句出现编译错误,不能修改final基本类型的值
//a=15;
//下面语句出现编译错误,不能将已经初始化的final变量指向另一个对象
//in=inClass2;
//下面语句成功,虽然引用不能改变但final变量引用的对象本身内容是可以改变的
in.mod(a);
}
classInClass{
intli_a=0;
publicInClass(inta){
li_a=a;
}
publicintmod(intb){
li_a=b;
returnli_a;
}
}
publicstaticvoidmain(Stringargs[]){
inta=100;
//内部类初始化
Test3test3=newTest3();
Test3.InClassin=test3.newInClass(30);
System.out.println(in.li_a);
test3.modifiedFinal(a,in);
System.out.println(in.li_a);
}
}
运行截图:
3)finalmethods:
可以锁住该method,不让继承类改变其意义(不允许子类覆写);允许编译器对此method作为inlinemethod调用。
程序代码:
publicclassTest4{
/**
*@paramargs
*/
privatefinalintli_int=0;
publicfinalintpub_fi_mod(){
returnli_int;
}
protectedfinalintpro_fi_mod(){
returnli_int;
}
privatefinalintpri_fi_mod(){
returnli_int;
}
privateintpri_mod(){
returnli_int;
}
}
publicclassTest5extendsTest4{
privateintli_i=100;
//下面的方法编译出错,不能覆盖final方法,只针对public和protected,子类中方法与父类中private的方法名相同不是覆盖,与父类中同方法名的方法没有任何关系(除了名字相同)。
/*
publicintpub_fi_mod(){
returnli_i;
}
protectedintpro_fi_mod(){
returnli_i;
}*/
privatefinalintpri_fi_mod(){
returnli_i;
}
privateintpri_mod(){
returnli_i;
}
publicstaticvoidmain(Stringargs[]){
System.out.println(newTest5().pri_mod());
}
}
运行截图:
4)当把一个class声明为final时,也就决定了此class将不能被继承(比如String类,此类为final类,具体可以参见其实现java.lang.String)。
finalclasses的methods可以是final,也可以是非final的;其中的数据成员可以是final的也可以不是,他们将服从finaldata的原则。
程序代码:
publicfinalclassTest6{
privatefinalintli_int=0;
publicintli_a=123;
publicfinalintmod(){
returnli_int;
}
publicintpri_mod(){
returnli_a;
}
publicstaticvoidmain(Stringargs[]){
System.out.println(newTest6().pri_mod());
}
}
//Test6是final类,所以Test7不能继承
publicclassTest7extendsTest6{
privateintli_int=0;
}
运行截图:
1)无Test7时:
2)有Test7时:
出错
4.3static关键字
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
程序代码:
publicclassTest{
privatestaticinta;
privateintb;
static{
Test.a=1;
System.out.println(a);
Testt=newTest();
t.f();
t.b=10;
System.out.println(t.b);
}
static{
Test.a=2;
System.out.println(a);
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 修饰 使用
![提示](https://static.bdocx.com/images/bang_tan.gif)