复用类-继承、组合、代理
来源:互联网 发布:钉钉侵犯员工隐私知乎 编辑:程序博客网 时间: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 jack2.继承:子类继承父类的特征,主要说一下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方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。
如果问题还望多多指教!每天进步一丢丢!!!
- 复用类-继承、组合、代理
- 复用类——组合,代理,还是继承?
- JAVA中的复用类:继承、组合和代理
- 组合 继承 与 代理
- Java之继承、组合、代理
- 初识继承、 组合、动态代理
- 第7章 复用类(组合,继承,代理)
- Java中的复用类——继承、组合和代理hello
- Java中的复用类——继承、组合和代理
- Java编程思想--组合,继承,代理
- java继承与组合与代理
- java复用类(组合、继承,代理,final关键字,初始化顺序) 知识点的总结
- 第七章:复用类(继承和组合)向上转型Override代理、构造器和清理
- 代理是继承与组合之间的中庸之道
- 组合、继承和代理三者的定义
- Java编程:组合、继承和代理的区别
- Java编程:组合、继承和代理的区别
- 继承 组合
- redis.conf详解之基本配置
- 小白笔记--------------leetcode(344. Reverse String)
- Xutils3的使用
- swift 构造函数 与便利构造函数
- 关于虚函数的整理(待续)
- 复用类-继承、组合、代理
- 多线程技术
- HTML
- 安卓RxJava学习第一弹
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- 装饰者模式(decorator)完全解析
- java内存管理,GC,内存泄漏
- HDU 4155 (博弈 记忆化搜索)
- java 使用html2canvas实现屏幕截图