Think in java 学习笔记:访问权限控制,复用类(继承)

1.protected使用

protected处理的是继承的概念,如果创建了一个新包,并从另一个包中继承类,可以访问的成员有public和protected。protected 也提供包访问权限。

package com.zhangyue.learn;

import static net.mindview.util.Print.*;

public class Test1 {
    protected int n;
    public int m;
    public static void main(String[] args) {
        print("aaaaa");
    }

}


package com.zhangyue.learn1;

import com.zhangyue.learn.Test1;

public class LearnProtect extends Test1{
    
    public static void main(String[] args) {
        LearnProtect l = new LearnProtect();
        l.m = 1;
        l.n = 2;
    }
}

class Other{
    void test(){
        Test1 t = new Test1();
        t.m = 2;
//      t.n = 1;
    }
}

2.访问权限控制将权限的边界化在了数据类型的内部的原因

  • 第一,设定客户端程序员可以使用和不可以使用的界限,可以在结构中建立自己的内部机制,不必担心客户端程序员把它当做是自己可以使用的接口的一部分。
  • 第二,就是接口和具体实现进行分离。如果一个结构是用于程序中,而客户端程序员除了可以向接口发送信息外什么也不可以做的话,就可以随意更改所有不是public的东西而不会破坏客户端代码。

3. 复用类

即可以通过创建新类来复用代码,而不必重头开始编写,可以使用别人已经开发并且调试好的类,有两种方法,组合语法和继承语法。

  • 组合语法:新有的类是由现有的类的对象组合而成的,复用了现有代码的功能,而不是它的形式。
  • 继承语法:按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。

5. 继承

当创建一个类时,总是在继承,除了明确指出继承哪个类,都隐式地继承Object类。

package com.zhangyue.learn;

class Cleanser{
    private String s = "Cleanser";
    public void append(String a){ s += a;}
    public void dilute(){ append(" dilute()");}
    public void apply(){ append(" apply()");}
    public void scrub(){ append(" scrub()");}
    public String toString(){return s;}
        //可以为每个类创建一个main()方法,方便测试
    public static void main(String[] args){
        Cleanser c = new Cleanser();
        c.dilute();c.apply();c.scrub();
        System.out.println(c);
    }
}
public class Detergent extends Cleanser{
    public void scrub(){
        append("Deprecated.scrub()");
        super.scrub();//super 表示超类的意思,当前类就是从超类继承过来的
    }
    public void foam(){
        append("foam()");
    }
    public static void main(String[] args) {
        Detergent d = new Detergent();
        d.apply();d.dilute();d.scrub();d.foam();
        System.out.println(d);
        System.out.println("Testing base class");
        Cleanser.main(args);
    }

}

6.基类初始化

  • 构造器不带参数
package com.zhangyue.learn;

class Art{
   public Art() {
       System.out.println("Art()");
   }
}
class Drawing extends Art{
   public Drawing() {
       System.out.println("Drawing()");
   }
}
public class Cartoon extends Drawing{
   public Cartoon() {
       System.out.println("Cartoon()");
   }
   public static void main(String[] args) {
       Cartoon c = new Cartoon();
   }

}
/*output
Art()
Drawing()
Cartoon()
*/

构造过程从基类向外扩散,基类在导出类可以访问它之前就完成了初始化。即使不为Cartoon创建构造器,编译器也会合成默认的构造器调用基类构造器。

  • 构造器带参数
package com.zhangyue.learn;

class Game{
    public Game(int i) {
        System.out.println("Game()");
    }
}
class BoardGame extends Game{
    public BoardGame(int i) {
        super(i);   //调用基类构造器
        System.out.println("BoardGame()");
    }
}

public class Chess extends BoardGame{
    public Chess() {
        super(11);
        System.out.println("Chess()");
    }
    public static void main(String[] args) {
        Chess c = new Chess();
    }

}

如果不在BoardGame里调用基类构造器,编译器会抱怨无法找到符合Game()形式的构造器,而且,调用基类构造器必须是在导出类构造器中要做的第一件事。

7. 向上转型

“为新的类提供方法”并不是继承中最重要的一面,其最重要的是用来表现新类和基类的关系,即“新类是现有类的一种类型”。

package com.zhangyue.learn;

class Instruction{
    public void paly(){}
    public static void tune(Instruction i){
        i.paly();
    }
}
public class Wing extends Instruction{

    public static void main(String[] args) {
        Wing w = new Wing();
        Instruction.tune(w);
    }

}

将Wing引用转换为Instruction引用的动作就是向上转型。是安全的。

8. 选择组合与继承

到底使用组合还是继承,一个最清晰的判断方法就是问问自己是否需要从新类向基类进行向上转型。

9.final关键字

  • 说明
    对于基本数据类型,final使数据恒定不变;对于对象引用,final是引用恒定不变。一旦引用指向某个对象,就不能再指向另一个对象,但对象本身是可以修改的,java没提供使对象恒定不变的途径。
    典型的常量定义方式:
    public static final VALUE_ONE;
    public指可用于包之外,static强调只有一份 只在第一次创建对象时初始化一次,final则说明是常量。

  • final方法
    将方法锁定,以防任何继承类修改它的定义。在继承中使方法行为保持不变并且不会被覆盖。

*final类
将整个类定义为final时,就表示不打算继承该类,对该类的设计不需要做任何变动。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,514评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 1、.java源文件: 一个以”.java“为后缀的源文件:只能有一个与文件名相同的类,可以包含其他类。 2、类方...
    Hughman阅读 1,430评论 1 9
  • 第一章 对象导论 对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据和方法,并且每一个对象都可以唯一地...
    niaoge2016阅读 811评论 0 0
  • 第七章 复用类 1. 组合语法 1)对于非基本类型的对象,必须将其引用置于新的类中,但可以定义基本类型数据。2)每...
    FreeCode阅读 573评论 0 0