复用类-继承、组合、代理

来源:互联网 发布:钉钉侵犯员工隐私知乎 编辑:程序博客网 时间:2024/04/28 00:33

 一  综述

     1.toStirng方法

     2.继承

     3.组合

     4.代理

     

二 分别解释

     1. toString方法,每一个非基本类型都有一个toString方法,当编译器需要一个toString,而你只有一个对象时,这个方法就会被调用。

     

public class Demo2 {private String name;public Demo2(String name) {this.name = name;}public String toString() {return "I am " + name;}public static void main(String[] args) {System.out.println(new Demo2("jack"));}}结果:I am jack
     2.继承:子类继承父类的特征,主要说一下protected。

        访问权限修饰符分别为:public、protected、默认的、private这个四个。首先public在同一个类中、同一个包中。同一个工程下面、不同的工程下面都可以访问。所谓权限大大的。protected在同一个package下面可以随便的访问,还有一个特殊的就是在继承的子类中可以访问。例如Father父类,Father类中有一个protected修饰的age方法,Son继承了Father(Son可以和Father不在一个package下面,不在一个工程下面不可以),默认实在同一个package下面可以访问,private只能在当前类中访问。

        权限修饰符主要的作用就是为了隐藏底层的内部实现,我自己理解不知道对不对!例如我做了一个求和的方法,

public int getSum(int from, int to) {return get(from,to);}private int get(int from, int to) {return (from + to) * (from - to + 1) / 2;}
     调用getSum就会得到一个区间的和,对外只提供了结果,而隐藏了内部的实现,当研发人员发现更好地实现方法实现求和时,只需要更改get方法即可。外部的调用仍然通过getSum获得结果。

          

     protected实例我是在同一个包下面的!        

class Vill {private String name;protected void set(String name) {this.name = name;}public Vill(String name) {this.name = name;System.out.println("father...");}public String toString() {return " i am " + name;}}public class VillExtends extends Vill {private int age;public VillExtends(String name, int age) {super(name);this.age = age;}public void f(String name, int age) {set(name);this.age = age;}public String toString() {return age + super.toString();}public static void main(String[] args) {VillExtends v = new VillExtends("aa", 11);System.out.println(v);v.f("jack", 33);        System.out.println(v);}

           protected就用户类而言,这是private的,而对于继承它的类而言是public 的。如果还有一个类Demo和villExtends在一个包下面,而和vill不在同一个包下面,那么vill的set方法相对于Demo类而言就是private,而对于villExtends而言就是public的。

      3.组合:一个在一个类中定义了另一个类的对象!这个就不详细说了

    4.组合和继承的关系:

         (1).如果存在一种IS-A的关系,并且一个类需要向另一个类暴露所有的方法接口,那么更应该用继承的机制。  

        (2).如果存在一种HAS-A的关系,那么更应该运用组合。

    5.代理:在一个类中创建另一个类的对象,以获取这个类的部分方法!

    

//上下左右移动public class Demo4 {public void r() {System.out.println("right");}public void l() {System.out.println("left");}public void d() {System.out.println("down");}public void u() {System.out.println("up");}}//左右移动 飞public class Demo5 {private Demo4 d = new Demo4();public void l() {d.l();}public void r() {d.r();}public void fly() {System.out.println("fly");}}
     类 Demo5拥有所有Demo4所有方法,但是Demo5相对比与继承,Demo5拥有更多的控制力,可以选择自己想要的方法!

 

  补充1:    

package com.demo.one;public class Demo05 {public static void main(String[] args) {new Circle();}}class Draw {static {System.out.println("jiazai Draw");}public Draw(String type) {System.out.println(type + " draw constructor");}}class Shape {private Draw draw = new Draw("shape");static {System.out.println("jiazai Shape");}public Shape() {System.out.println("shape constructor");}}class Circle extends Shape {private Draw draw = new Draw("circle");static {System.out.println("jiazai Circle");}public Circle() {System.out.println("circle constructor");}}结果:jiazai Shapejiazai Circlejiazai Drawshape draw constructorshape constructorcircle draw constructorcircle constructor

    加载上面类的过程:Demo05 Shape CircleDraw。入口函数 父类 子类 初始化调用类只是很单纯的加载了类,调用了类的方法。

  初始化的过程和类的加载过程是不一样的。什么时候初始化什么时候调用相应的构造方法。

  两个特殊的静态方法不需要初始化对象就能调用的:main、构造方法都是用static修饰的。

补充2:摘抄地址:http://www.cnblogs.com/dolphin0520/p/3803432.html

public class Test {    public static void main(String[] args)  {        Shape shape = new Circle();        System.out.println(shape.name);        shape.printType();        shape.printName();    }} class Shape {    public String name = "shape";         public Shape(){        System.out.println("shape constructor");    }         public void printType() {        System.out.println("this is shape");    }         public static void printName() {        System.out.println("shape");    }} class Circle extends Shape {    /覆盖    public String name = "circle";         public Circle() {        System.out.println("circle constructor");    }     //覆盖    public void printType() {        System.out.println("this is circle");    }    //隐藏    public static void printName() {        System.out.println("circle");    }}结果:shape constructorcircle constructorshapethis is circleshape
    覆盖只针对非静态方法(终态方法不能被继承,所以就存在覆盖一说了),而隐藏是针对成员变量和静态方法的。这2者之间的区别是:覆盖受RTTI(Runtime type  identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。

   


    如果问题还望多多指教!每天进步一丢丢!!!

        

0 0