2 面向对象的基本特征

2.1 封装

        封装是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象的内部,不允许外部程序直接访问对象的内部信息,只能通过该类所提供的方法来实现对内部信息的操作和访问。

2.1.1 访问控制符

    访问控制级别的详细介绍如下:

        - private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符修饰,则这个成员只能在当前类的内部被访问。

        - 默认(包访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限的,default访问控制的成员或外部类可以被相同包下的其他类访问。

        - protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员即可以被同一个包中的其他类访问,也可以被不同包中的子类访问。用protected修饰的方法,是希望子类重写这个方法。

        - public(公共访问权限):如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类可以被所有类访问。

        注意:外部类只能有两种访问控制级别:public和默认。

2.1.2 package、import 和 import static

    包(package)

        - Java引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。

        - 包名应该全部是小写字母,而且应该由一个或多个有意义的单词连缀而成。

        - 同一个包下的类可以自由访问,不同包下的类相互访问时需要添加包前缀。

    import

        - Java引入了import关键字,import可以向某个Java文件中导入指定包层次下某个类或全部类。

        - import语句中的星号(*)只能代表包下的全部类,不能代表包。

        - import语句应该出现在package语句之后,类定义之前。

    import static

        - JDK 1.5 之后增加的import static用于导入指定类的某个静态成员变量、静态方法或全部的静态成员变量、静态方法。

        - import static语句中的星号(*)只能代表类中全部的静态成员变量和静态方法。

        - import static语句应该出现在package语句之后,类定义之前。

2.2 继承    

        继承是实现软件复用的重要手段。Java的继承使用extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类。父类和子类的关系,是一种一般和特殊的关系。

        Java只能有一个直接父类,但可以有多个间接父类。

2.2.1 方法重写

        子类包含与父类同名方法的现象被称为方法重写

        方法名相同,形参列表相同。子类方法的返回值类型应比父类方法的返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。子类方法的访问权限应比父类方法的访问权限更大或相等。

        覆盖方法和被覆盖的方法要么都是类方法,要么都是实例方法,不能一个是类方法一个是实例方法。    

        如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super调用被覆盖的实例方法或使用父类类名调用被覆盖的类方法。

        子类无法重写父类中private修饰的方法,即使定义一个相同的方法,也是在子类中重新写了一个新方法。

        如果父类构造器调用了希望被子类重写的方法,则调用的是被子类重写后的方法。

2.2.2 super 限定

        super用于限定该对象调用它从父类继承得到的实例变量或实例方法。如果在构造器中使用super。则super用于限定该构造器初始化的是该对象从父类继承得到的实例变量。

        通过super调用父类构造器的语句必须出现在子类构造器的第一句。super不能出现在static修饰的方法中。当调用子类构造器来初始化子类的对象时,父类构造器总会在子类构造器之前执行。

2.3 多态

        相同类型的变量,调用同一方法是呈现出多种不同的行为特征,即为多态。与方法不同的是,对象的实例变量不具备多态性。    

2.3.1 instanceof运算符

        instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类,也可以是一个接口。

        instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系。不在同一继承树的对象和类用instanceof比较时,编译不通过。

2.4 初始化块

        初始化块只能用static修饰,使用static修饰的初始化块被称为静态初始化块,用于对类变量进行初始化,不能对实例变量进行初始化。初始化块对对象进行初始化。初始化块是在类初始化或创建对象时隐式执行的,而且初始化块在执行构造器之前执行

        初始化块的代码在编译后,会被还原到每个构造器中,位于构造器中所有代码的前面。

    执行顺序:

        - 前面定义的初始化块先执行,后面定义的初始化块后执行。初始化块中成员变量的赋值语句和声明成员变量时指定的初始值,赋值顺序与它们在源代码中的排列顺序相同。

        - 创建实例时,系统先执行父类的初始化块,后执行父类的构造器,再执行子类的初始化块和构造器。初始化类时,系统先执行父类的静态初始化块,后执行子类的静态初始化块。

2.5 Object类

        Java对象都是Object类的实例,都可以直接调用类中定义的方法,这些方法提供了处理Java对象的通用方法。

    toString方法

        Object类提供的toString()方法总是返回该对象实现类的“类名+@——hashCode”值,子类中可以重写此方法返回对象的详细信息。

    ==和equals方法

        对于两个基本类型的变量,只要它们的值相等,==判断就返回true;对于两个引用类型的变量,只有它们指向同一个对象时,==判断才会返回true。==不可以比较类型上没有父子关系的两个对象。

        使用equals()方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。但String类重写了该方法,所以String类的equals()方法判断字符串对象的字符序列,只要字符序列相同就返回true。

2.6 final修饰符

        final修饰的变量不可改变,一旦获得了初始值,该final变量就不能被重新赋值。final修饰基本类型时,不能对基本类型变量重新赋值;final修饰引用类型变量时,此变量引用的对象的地址不能被改变,但这个对象完全可以发生改变。

2.6.1 final成员变量

        final修饰的成员变量必须由程序员显式地指定初始值,系统不会对final修饰的成员变量进行隐式初始化。

    final修饰的类变量、实例变量指定初始值的时机如下:

        - 类变量:必须在静态初始化块中指定初始值,或声明该类变量时指定初始值,而且只能在两种方法中执行其中一种。类变量不能再非静态初始化快中指定初始值。

        - 实例变量:必须在非静态初始化块、声明该实例变量或构造器中指定初始值,而且只能在三种方法中执行其中一种。如果非静态初始化块中为实例变量指定了初始值,则不能再在构造器中为该实例变量指定初始值。

2.6.2 final局部变量

        如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能赋值一次;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。

2.6.3 可执行“宏替换”的final变量

        如果某个变量使用final修饰符修饰,在定义该final变量时指定了初始值,并且该初始值可以在编译时就被确定下来,那么这个变量相当于一个直接量。

        除final变量赋值时赋直接量的情况外,如果被赋的表达式只是基本的算术表达式或字符串连接运算,没有访问普通变量,也没有调用方法,那么Java编译器同样会将这种final变量当成“宏变量”处理。

2.6.4 final方法

        final修饰的方法不可被重写。

        如果父类中由一个用final修饰的private方法,那么子类中可以定义一个和此方法具有相同方法签名的方法。因为父类中private的方法在子类中不可见。

2.6.5 final类

        final修饰的类不能被继承。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,681评论 18 399
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,214评论 1 44
  • 一、继承 当两个事物之间存在一定的所属关系,即就像孩子从父母那里得到遗传基因一样,当然,java要遗传的更完美,这...
    玉圣阅读 1,057评论 0 2
  • 十年,是一个什么概念,人生中又有多少个十年?我也许到现在都不是那么清楚。但我所清楚的是,在这个十年,我过得很快乐...
    贼拉帅雨寒阅读 313评论 0 2