菜鸟学习笔记:Java面向对象篇中

  • 继承
    • 概念
    • 方法重写(override)
    • Object类
    • Super关键字
    • 组合
    • final关键字补充
  • 封装
    • 访问控制符
  • 多态

继承

概念

继续上一篇的例子:

#mermaid-svg-LbRAjOjTZTojE4K9 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .label text{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .node rect,#mermaid-svg-LbRAjOjTZTojE4K9 .node circle,#mermaid-svg-LbRAjOjTZTojE4K9 .node ellipse,#mermaid-svg-LbRAjOjTZTojE4K9 .node polygon,#mermaid-svg-LbRAjOjTZTojE4K9 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-LbRAjOjTZTojE4K9 .node .label{text-align:center;fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .node.clickable{cursor:pointer}#mermaid-svg-LbRAjOjTZTojE4K9 .arrowheadPath{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-LbRAjOjTZTojE4K9 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-LbRAjOjTZTojE4K9 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-LbRAjOjTZTojE4K9 .edgeLabel rect{opacity:0.9}#mermaid-svg-LbRAjOjTZTojE4K9 .edgeLabel span{color:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-LbRAjOjTZTojE4K9 .cluster text{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-LbRAjOjTZTojE4K9 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-LbRAjOjTZTojE4K9 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-LbRAjOjTZTojE4K9 .actor-line{stroke:grey}#mermaid-svg-LbRAjOjTZTojE4K9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-LbRAjOjTZTojE4K9 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .sequenceNumber{fill:#fff}#mermaid-svg-LbRAjOjTZTojE4K9 #sequencenumber{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .messageText{fill:#333;stroke:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-LbRAjOjTZTojE4K9 .labelText,#mermaid-svg-LbRAjOjTZTojE4K9 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-LbRAjOjTZTojE4K9 .loopText,#mermaid-svg-LbRAjOjTZTojE4K9 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-LbRAjOjTZTojE4K9 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-LbRAjOjTZTojE4K9 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-LbRAjOjTZTojE4K9 .noteText,#mermaid-svg-LbRAjOjTZTojE4K9 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-LbRAjOjTZTojE4K9 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-LbRAjOjTZTojE4K9 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-LbRAjOjTZTojE4K9 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-LbRAjOjTZTojE4K9 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .section{stroke:none;opacity:0.2}#mermaid-svg-LbRAjOjTZTojE4K9 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-LbRAjOjTZTojE4K9 .section2{fill:#fff400}#mermaid-svg-LbRAjOjTZTojE4K9 .section1,#mermaid-svg-LbRAjOjTZTojE4K9 .section3{fill:#fff;opacity:0.2}#mermaid-svg-LbRAjOjTZTojE4K9 .sectionTitle0{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .sectionTitle1{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .sectionTitle2{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .sectionTitle3{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-LbRAjOjTZTojE4K9 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .grid path{stroke-width:0}#mermaid-svg-LbRAjOjTZTojE4K9 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-LbRAjOjTZTojE4K9 .task{stroke-width:2}#mermaid-svg-LbRAjOjTZTojE4K9 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .taskText:not([font-size]){font-size:11px}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-LbRAjOjTZTojE4K9 .task.clickable{cursor:pointer}#mermaid-svg-LbRAjOjTZTojE4K9 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LbRAjOjTZTojE4K9 .taskText0,#mermaid-svg-LbRAjOjTZTojE4K9 .taskText1,#mermaid-svg-LbRAjOjTZTojE4K9 .taskText2,#mermaid-svg-LbRAjOjTZTojE4K9 .taskText3{fill:#fff}#mermaid-svg-LbRAjOjTZTojE4K9 .task0,#mermaid-svg-LbRAjOjTZTojE4K9 .task1,#mermaid-svg-LbRAjOjTZTojE4K9 .task2,#mermaid-svg-LbRAjOjTZTojE4K9 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutside0,#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutside2{fill:#000}#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutside1,#mermaid-svg-LbRAjOjTZTojE4K9 .taskTextOutside3{fill:#000}#mermaid-svg-LbRAjOjTZTojE4K9 .active0,#mermaid-svg-LbRAjOjTZTojE4K9 .active1,#mermaid-svg-LbRAjOjTZTojE4K9 .active2,#mermaid-svg-LbRAjOjTZTojE4K9 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-LbRAjOjTZTojE4K9 .activeText0,#mermaid-svg-LbRAjOjTZTojE4K9 .activeText1,#mermaid-svg-LbRAjOjTZTojE4K9 .activeText2,#mermaid-svg-LbRAjOjTZTojE4K9 .activeText3{fill:#000 !important}#mermaid-svg-LbRAjOjTZTojE4K9 .done0,#mermaid-svg-LbRAjOjTZTojE4K9 .done1,#mermaid-svg-LbRAjOjTZTojE4K9 .done2,#mermaid-svg-LbRAjOjTZTojE4K9 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-LbRAjOjTZTojE4K9 .doneText0,#mermaid-svg-LbRAjOjTZTojE4K9 .doneText1,#mermaid-svg-LbRAjOjTZTojE4K9 .doneText2,#mermaid-svg-LbRAjOjTZTojE4K9 .doneText3{fill:#000 !important}#mermaid-svg-LbRAjOjTZTojE4K9 .crit0,#mermaid-svg-LbRAjOjTZTojE4K9 .crit1,#mermaid-svg-LbRAjOjTZTojE4K9 .crit2,#mermaid-svg-LbRAjOjTZTojE4K9 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-LbRAjOjTZTojE4K9 .activeCrit0,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCrit1,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCrit2,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-LbRAjOjTZTojE4K9 .doneCrit0,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCrit1,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCrit2,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-LbRAjOjTZTojE4K9 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-LbRAjOjTZTojE4K9 .milestoneText{font-style:italic}#mermaid-svg-LbRAjOjTZTojE4K9 .doneCritText0,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCritText1,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCritText2,#mermaid-svg-LbRAjOjTZTojE4K9 .doneCritText3{fill:#000 !important}#mermaid-svg-LbRAjOjTZTojE4K9 .activeCritText0,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCritText1,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCritText2,#mermaid-svg-LbRAjOjTZTojE4K9 .activeCritText3{fill:#000 !important}#mermaid-svg-LbRAjOjTZTojE4K9 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-LbRAjOjTZTojE4K9 g.classGroup text .title{font-weight:bolder}#mermaid-svg-LbRAjOjTZTojE4K9 g.clickable{cursor:pointer}#mermaid-svg-LbRAjOjTZTojE4K9 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-LbRAjOjTZTojE4K9 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-LbRAjOjTZTojE4K9 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-LbRAjOjTZTojE4K9 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-LbRAjOjTZTojE4K9 .dashed-line{stroke-dasharray:3}#mermaid-svg-LbRAjOjTZTojE4K9 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 .commit-id,#mermaid-svg-LbRAjOjTZTojE4K9 .commit-msg,#mermaid-svg-LbRAjOjTZTojE4K9 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-LbRAjOjTZTojE4K9 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-LbRAjOjTZTojE4K9 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-LbRAjOjTZTojE4K9 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-LbRAjOjTZTojE4K9 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-LbRAjOjTZTojE4K9 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-LbRAjOjTZTojE4K9 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-LbRAjOjTZTojE4K9 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-LbRAjOjTZTojE4K9 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-LbRAjOjTZTojE4K9 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-LbRAjOjTZTojE4K9 .edgeLabel text{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LbRAjOjTZTojE4K9 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-LbRAjOjTZTojE4K9 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-LbRAjOjTZTojE4K9 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-LbRAjOjTZTojE4K9 .note-edge{stroke-dasharray:5}#mermaid-svg-LbRAjOjTZTojE4K9 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-LbRAjOjTZTojE4K9 .error-icon{fill:#522}#mermaid-svg-LbRAjOjTZTojE4K9 .error-text{fill:#522;stroke:#522}#mermaid-svg-LbRAjOjTZTojE4K9 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-LbRAjOjTZTojE4K9 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-LbRAjOjTZTojE4K9 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-LbRAjOjTZTojE4K9 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-LbRAjOjTZTojE4K9 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-LbRAjOjTZTojE4K9 .marker{fill:#333}#mermaid-svg-LbRAjOjTZTojE4K9 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-LbRAjOjTZTojE4K9 {color: rgba(0, 0, 0, 0.75);font: ;}生物类寿命生活环境...grow()reproduction()动物类代谢方式...move()植物类微生物类鱼类鸟类哺乳类

生物类是对所有有生命事物的抽象,而生物又可以分为植物、动物和微生物,它们有生物所有的属性和行为,但又有着自己独有的特征,所以它们是生物类的子类。同样的鱼类鸟类也是动物类的子类。大类包含小类的关系就称为继承。在Java中的继承用extends关键字表示。
在代码中使用继承来管理类之间的关系可以很好的提高代码的复用性,假设需要定义所有的动物类,那么如果不用继承,我们会写出这样的代码:

class Fish{int old;   String environment;String metabolize;public void grow(){   System.out.println("我在成长"); }public void reproduction(){  System.out.println("我在繁殖");}public void move(){   System.out.println("我在移动");}public void Swimming(){   System.out.println("游泳,游泳");}
}
class Bird{int old;   String environment;String metabolize;public void grow(){  System.out.println("我在成长"); }public void reproduction(){  System.out.println("我在繁殖");}public void move(){   System.out.println("我在移动");}public void Fly(){    System.out.println("飞啊飞");}
}

像这样的代码,如果类多了那么会非常冗余,如果用继承的方式那代码就可以这样写:

//首先定义动物父类
class Animal{int old;   String environment;String metabolize;public void grow(){    System.out.println("我在成长"); }public void reproduction(){  System.out.println("我在繁殖");}public void move(){   System.out.println("我在移动");}}
//鱼类继承动物类
class Fish extends Animal{public void Swimming(){   System.out.println("游泳,游泳");}
}
//鸟类继承动物类
class Fish extends Animal{public void Fly(){    System.out.println("飞啊飞");}
}

这样父类的属性和方法在子类中就可以使用:

public static void main(String[] args) {Fish oFish = new Fish();  Bird oBrid = new Bird();oFish.environment = "大海"; //子类有父类属性oBrid.environment = "天空"; //子类有父类属性oFish.move();//子类调用父类方法,打印“我在移动”oBrid.Fly();//子类调用自己方法,打印"飞啊飞"}

通过上例可以看到继承的优势在两个实例时已经很明显了。对Java继承有几点可以总结一下:
Java中定义类时如果没有指定父类那么默认继承:java.lang.Object
Java中只有单继承,不能多继承,意思就是一个类只能有一个父类。

方法重写(override)

在之前讲重载时提前说过这个概念,这两个概念特别容易混,所以大家最好放在一块记。
在子类继承父类时,父类方法可能无法完全实现子类的需求,这时子类就可以通过方法重写对父类方法进行一定修改,还是上面那个例子,在鱼类中我们修改父类的move方法:

class Fish extends Animal{public void move(){    System.out.println("我在游着移动");}public void Swimming(){ System.out.println("游泳,游泳");}}

这样在main方法中:

public static void main(String[] args) {Fish oFish = new Fish();  oFish.move();//子类重写父类方法,打印“我在游着移动”}

注意重写的方法必须和被重写的方法有同样的方法名称、参数列表和返回值类型。父类中:int move(String methods)方法重写也必须是这种形式。

Object类

刚刚提到的Object类是Java所有类型的根类,在没有extends的情况下默认继承这个类,
Object类的概念很简单,重要的是Object上的默认方法,这是面试的重要考点之一,我们可以对这些方法加以运用,同样也可以对其重写,下面介绍几个常用Object方法:

1.equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false。equals方法和“==”的区别面试中的常见问题,个人单独对其做了下简单的总结,准备面试的小伙伴可以简单看一看, 原文链接:

2.toString()方法,普通对象调用会返回代表对象的“类名”+@+对象哈希码的16进制字符串(可以理解为对象唯一标识)。Integer(int类型的包装类,后面讲)等包装类会重写该方法,会将本来的数据转化为字符串显示。

3.clone()方法,将对象复制一份,得到一个新的对象。注意复制后生成新对象,==判断为false。

4.getClass()方法,通过对象获取类。

这里罗列的几个我能想到的较为常用的方法,想了解其他方法就需要自己去阅读源码了,这里啰嗦以下,确实刚开始的时候阅读源码很痛苦,但你不得不承认阅读源码和实践是提升编成能力的最好方式,只有真的知道它怎么写你才能学懂它。

Super关键字

super与this相对应,是我们定义方法时传入的另一个隐式参数,它是直接父类对象的引用(指向父类的引用变量,如果不解可以回顾一下引用变量),可以通过其来访问父类中被子类重写的属性和方法。
到这你可能会有疑问我没有建立父类对象啊,为什么又冒出个父类对象,实际上在每次调用构造方法时会默认在构造函数开始时调用super(),也就是父类的构造方法,举例说明:

 class Animal{int old;   String environment;String metabolize;Animal(){System.out.println("Animal构造方法被调用了"); }public void grow(){  System.out.println("我在成长"); }public void reproduction(){  System.out.println("我在繁殖");}public void move(){   System.out.println("我在移动");}}
class Fish extends Animal{//没有写构造方法,那么Java会默认给我们添加无参构造方法,而在无参构造方法中又会默认调用super()方法,默认添加的代码如下://Fish(){//super();//}public void move(){  System.out.println("我在游着移动");}public void Swimming(){ System.out.println("游泳,游泳");}}

在main函数中:

public static void main(String[] args) {Fish oFish = new Fish();  //这时会打印Animal构造方法被调用了}

这段程序在堆中的对象结构是这样的:

总结来说,在我们new一个对象时,由于非Object类的构造方法中会默认调用super()方法,那么堆中会同时生成一个Object对象和一个Animal对象,所有非Object对象的方法中都会有this和super两个隐式参数,当子类调用方法时会先在自己的方法中寻找,如果找不到回去父类的方法中寻找,如果找不到再去父类的父类中寻找,依次向上直到Object类还未找到的话报出错误。当父类的方法被子类重写时则会在子类中生成新的方法,子类调用时直接调用自身的方法。像上例中,Fish对象调用move()方法时会直接调用自己重写的move()方法,不再去父类中寻找。

组合

解决代码复用问题的除了继承还可以用组合来实现,话不多说直接实例:

  class Fish extends Animal{Animal animal = new Animal();//再这里直接定义Animal类型变量,这样也可以使用Animal中的属性和方法,这种方式就叫组合public void move(){ animal.move();//这样也可以调用父类的方法}public void Swimming(){    System.out.println("游泳,游泳");}}

main方法中:

public static void main(String[] args) {Fish oFish = new fish();  //这时会打印Animal构造方法被调用了oFish.animal.old//调用父类属性oFish.move();//打印我在移动}

在类中包含其他类的成员时一般可以用组合实现(衣服类里有一个扣子类属性),注意他和继承的区别也是面试容易问道的问题。

final关键字补充

在讲完继承之后我们就可以把final关键字扩充到方法和类层面:

  • 在修饰变量时,正如第二篇所说的的代表常量。
  • 在修饰方法时,被修饰方法不可以被子类重写,但是可以自己重载。
  • 在修饰类时,表示该类不能再有子类,也就是不能被继承(比如Math类、String类)。

封装

在我们开开心心的写代码时,我们只需要关系在键盘上按那些键后编辑器中会出现我们想要的代码,而不用去在乎键盘的键是怎么输入到显示屏上的,封装就是这个道理,我们在写程序时要求高内聚、低耦合,高内聚要求用户使用程序时可以根据输入得到正确的输出,而不需要关心内部是怎么实现的。而低耦合则要求供用户使用的方法越少越好。

访问控制符

之前写的例子中方法最前面通常要加一个public,它就是访问控制符,访问控制符用来来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端。当然访问控制符不止public,以下罗列出所有访问控制符:

访问控 同一个类中可访问 同一个包中可访问 子类可以访问 所有类可以访问
private 可以
default 可以 可以
protected 可以 可以 可以
public 可以 可以 可以 可以

其中如果属性或方法之前没有加访问控制符则默认同一个类和包中可以访问(default)。
为实现封装的思想在类中的属性一般采用private来修饰,方法一般采用public来修饰,其中外部可以访问的属性要提供响应的get(获取)/set(设置)方法(Eclipse可以自动生成,注意生成Boolean类型get方法以is开头),通过两个方法对内进行访问。一些辅助性的方法也可以用private修饰。运用封装思想我们可以改造Animal类,此时的类就是Java类的基本样子了。

  class Animal{//属性private int old;   private String environment;private String metabolize;//构造方法public Animal() {super();}//get和set方法public int getOld() {return old;}public void setOld(int old) {this.old = old;}public String getEnvironment() {return environment;}public void setEnvironment(String environment) {this.environment = environment;}public String getMetabolize() {return metabolize;}public void setMetabolize(String metabolize) {this.metabolize = metabolize;}//私有方法private String Name(){return "我是动物,";}//提供给外部调用的方法public void grow(){    System.out.println(Name()+"我在成长"); }public void reproduction(){  System.out.println("我在繁殖");}public void move(){   System.out.println("我在移动");}
}

多态

以上面Animal类的Fish类还是如下结构:

 class Fish extends Animal{public void move(){   System.out.println("我在游着移动");}public void Swimming(){ System.out.println("游泳,游泳");}}

我们在main方法中可以这样做

public test{public static void move(Animal a){a.move();//调用Animal类中的set方法设置old属性}public static void main(String[] args) {Fish oFish1 = new Fish();  //用Fish类的引用来指向fish对象Animal oFish2 = new Fish();//用Animal类的引用指向fish对象,程序不会报错Object oFish3 = new Fish();//用Object类的引用指向fish对象,程序也不会报错move(oFish2); //会打印"我在游着移动"//等价于Animal a = oFish2;a.move();move(oFish1);  //会打印"我在游着移动"//等价于Animal a = oFish1;a.move();move(oFish3);  //会抛异常//等价于Animal a = oFish3;a.move();oFish3是Object类型引用,//虽然对象是Animal的子类,但程序为避免错误不允许进行引用传递,//解决方法move((Animal)oFish3);}
}

这段代码就是多态,总结来说就是父类引用指向子类对象。从实际层面上理解就是一条鱼是鱼类,也是动物类,也是生物类,这些类的都可以囊括一条鱼。一般情况下如果有方法重写,用多态可以很好的提高代码复用性。上例中内存结构如图:

上一篇:菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

下一篇:菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类).

菜鸟学习笔记:Java基础篇4(面向对象三大特征)相关推荐

  1. Java学习笔记之基础篇

    Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...

  2. jqGrid 学习笔记整理——基础篇

    jqGrid 学习笔记整理--基础篇 jqGrid 实例中文版网址:http://blog.mn886.net/jqGrid/ 国外官网:http://www.trirand.com/blog/ 本人 ...

  3. 学习笔记-java基础-网络编程

    刚在培训机构学习完JAVA基础和WEB,感觉边学边忘.就把这作为记忆的笔记,我也不知道要不要记笔记,写在本子上太耗费时间了. 一.要想实现网络通信,首先要解决两个问题: ①:如何从网络中定位到一台或多 ...

  4. Java菜鸟教程系列 学习笔记总结 基础篇(1)

    基础语法 本博客通过学习菜鸟教程Java专栏,并整理得出的Java基础知识. 命名规范 1.项目名全部小写 2.包名全部小写 3.类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写.如: ...

  5. golang学习笔记(基础篇)

    LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...

  6. 狂神说Java学习笔记 Java基础

    目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...

  7. Excel学习笔记之基础篇

    记录一下跟着网易云课堂大饼老师Excel课程学习的笔记,只能起一个大纲的作用吧,用来练习的数据表不方便上传,也懒得截图录屏做成GIF操作啥的.课程共分为基础篇,进阶篇之函数,进阶篇之数据透视,进阶篇之 ...

  8. 【ESP32最全学习笔记(基础篇)——1.ESP32简介】

      ESP32 新手?从这里开始! 关于本教程: ESP32 基础篇                                 1.ESP32简介 ☑ 2.ESP32 Arduino 集成开发环 ...

  9. MySQL学习笔记(基础篇未完待补充)

    一.MySQL数据库基 目录 一.MySQL数据库基础篇 1.数据库概述与MySQL安装篇 第1章:数据库概述 1.为什么要使用数据库 2. 数据库与数据库管理系统 2.2 数据库与数据库管理系统的关 ...

  10. threejs 物体根据相机位置显示_Threejs学习笔记(一) 基础篇

    基本概念 此学习笔记主要记录使用threejs的制作http://sqace.163.com网站中用到的API和相关知识点. 一个完整的3D环境包含以下元素: 1.场景(Scene):是物体.光源等元 ...

最新文章

  1. “西南偏南” 三十年首次 “聚焦中国”
  2. ubuntu下面搭建SolrCloud集群
  3. 光缆衰减标准(待补充)
  4. python查看方法作用_python学习笔记1,新手小白也能看得懂
  5. 电脑win10-重装系统
  6. 关于pytorch中super的一点思考,结合代码
  7. Music List
  8. Java语言实现hello world代码
  9. opencv源码学习: getStructuringElement函数;
  10. 艾伟_转载:Cookie是什么?用法是怎样?与SESSION有什么区别?(二)
  11. 超详细Gitlab Runner环境配置中文教程
  12. 大数据分析有哪些技巧
  13. MATLAB中if (0)
  14. 使用http-server搭建web服务器
  15. c语言经典50道例题---精华篇
  16. KNX智能照明系统在福安中医院的应用
  17. python核心技术与实战,Python核心技术与实战——十五|深入了解迭代器和生成器...
  18. 07、Flutter FFI 数组
  19. [ZROI1788]计算器
  20. 跟小博老师一起学JSP ——EL表达式

热门文章

  1. linux配置utf-8环境
  2. mysql-workbench 导入csv格式数据报错:Unhandled exception: Could not determine delimiter
  3. cubic差值matlab,matlab自带的插值函数interp1的四种插值方法
  4. 阿里云mysql不让锁表_MySQL中InnoDB锁不住表的原因
  5. linux 环境搭建Jenkins
  6. python date,datetime 和time的区别
  7. BZOJ3928 [Cerc2014] Outer space invaders
  8. Android用户界面
  9. 使用libvirt技术监控虚拟机资源利用情况
  10. java 蓝桥杯 乘法次数(题解)