Java基础3-关于修饰符

实际开发中,为了对变量进行封装,提高方法和变量访问安全性等,就要用到各种修饰符的功能。

Java修饰符分两种

1、访问修饰符

public 公用的,对所有类可见,可用来修饰类,方法和变量,构造函数
protected 受保护的,同包或子类可见,可用来修饰方法和变量,构造函数
defualt 默认的,不带修饰符,仅对同包可见,可用来修饰类,方法和变量,构造函数

private 受保护的,仅本类内可见,可用来修饰类,方法和变量,构造函数
这里写图片描述

2、非访问修饰符

static

静态修饰符,可以用于修饰类,方法,和变量
修饰类时,作为静态内部类使用。
修饰方法和变量时,程序运行时就加载,不用new 一个对象,就能直接调用,常用final一起用

例子:
/*定义一个静态内部类,里面包含静态方法和静态变量*/ public static final class FinalClass3Static { public static String string = "这是FinalClass3的的静态内部类FinalClass3Static的final3Method()"; public static void final3Method() { System.out.println(string); } }

final

可以用于修饰类,方法,还有变量
当用于修饰类时,该类不能被继承,故没有子类,此final类中的方法默认是final的,反正不能被继承,那也是没办法被重写的了。
当用于修饰方法时,final方法不能被子类重写,但可以被直接调用,也可以被重载
当用于修饰变量时,常与static合用,表示常量,只能被赋值一次,赋值后值不能再被改变。

案例1:
public final abstract class AbstractClass{}
这样写是错的,final不能和abstract共用,因为抽象类的诞生就是为了让子类来继承它 再实现方法的,而加了final之后就无法被继承了,这样定义这类没意义了。

案例2:
public final class AbstractClass{} public class Class2 extends AbstractClass{}
这样写是错的,因为final类无法被继承

案例3:

public class FinalClass{ public final void finalMethod1(){ System.out.println("这是FinalClass下的finalMethod1()方法"); } } public class FinalClass2 extends FinalClass { /*final方法只能在子类直接调用,而无法进行重写*/ @Override public final void finalMethod1() { System.out.println("这是TestFinal2n下的finalMethod1()方法"); } /*随不能重写,但可以重载*/ public static final void finalMethod1(String string){ System.out.println("这是FinalClass2下的finalMethod1()方法"+string); } }

这样写是错的,因为finalMethod1()是final方法,继承的子类只能直接调用该方法,但不能重写final方法。 ps:可以重载该方法

案例4:
public static final String MY_FINAL_STRING ="myFinalString"; MY_FINAL_STRING = “ttt”;
这样写也是错的,无法为final变量重新赋值

abstract

可以用来修饰类和方法,abstract不能和final或static公用。案例中会解释
用于修饰类时,抽象类可以包含抽象方法,也可以不包含抽象方法,但如果是包含抽象方法,则一定要变成抽象类。
当子类继承某抽象类时,必须实现其中的抽象方法。
用于修饰方法时,该方法只能有方法声明,不能包含方法体,需要被子类覆盖重写该方法,才能使用。
不能用来修饰变量。

案例1:
public final abstract void AbstractMethod(){ System.out.println("这是一个抽象方法"); }

这是错的,抽象方法不能再用final来修饰,因为抽象方法只有继承了它的子类才能调用的(而加了final的类不能被继承),也不能有方法体
public static abstract void AbstractMethod(){
System.out.println("这是一个抽象方法"); }
这也是错的,因为static表示静态,而abstract是动态的要运行时才能确定下来

案例2:
public abstract class AbstractClass {}
AbstractClass abstractClass = new AbstractClass();
这是错的,抽象类无法被实例化,不能new,但可以用匿名内部类的方法来实现,如下面
AbstractClass abstractClass = new AbstractClass() { @Override public void AbstractMethod2() { } @Override void AbstractMethod3() { } };

synchronized

当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

transient

在java中,如果一个对象实现了serializable接口,那么这对象的方法和属性就可以被序列化,但实际开发中,我们有时方法或属性并不想它被序列化,此时就要用到transient关键字,添加了此关键字的属性,在实现serializable接口,不会被序列化 transient关键字只能修饰变量,而不能修饰方法和类

volatile

用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的 存在线程安全问题。

Demo工程下载地址

http://download.csdn.net/detail/forgot2015/9732243

参考文章

http://lavasoft.blog.51cto.com/62575/18771/ http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html http://www.cnblogs.com/lanxuezaipiao/p/3369962.html http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,582评论 0 11
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 6,939评论 0 62
  • 看图不说话,步骤都如图所示:
    景彧阅读 310评论 0 0
  • 第一次没有听见闹钟响起,安静的清晨,安静的武汉。 猛的一惊,才想起昨天手表丢失的事情。 当你习惯了身边有一样东西的...
    MKeeper阅读 79评论 0 1