复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书
一:组合语法:就是将对象的引用放到新类中即可
代码:
package com.wj.reuse; /** * * @author Administrator 组合类的使用 */ public class SpringkSystem { private String value1, value2, value3, value4; private int i; private float f; //创建对象 private WaterSource source = new WaterSource(); //打印输出 @Override public String toString() { return "value1=" + value1 + "value2=" + value2 + "value3=" + value3+ "value4=" + value4 + "\r\n" + "i=" + i + "f=" + f + "\r\n" + "source=" + source;//对象 } //主函数 public static void main(String[] args) { //创建对象 SpringkSystem system = new SpringkSystem(); //输出对象,java中默认输出system.toString(); //系统会自动的加上toString() System.out.println(system); } } // 内部类 class WaterSource { // private String s; //构造函数 public WaterSource() { System.out.println("WaterSource()"); s = "Constructed"; } @Override//重写toString()方法 public String toString() { return s; } }
WaterSource()
value1=nullvalue2=nullvalue3=nullvalue4=null
i=0f=0.0
source=Constructed
toString();将对象编程一个字符串类型的数据,否则打印的是对象的地址
二:继承语法
在java oop中创建的类如果没有使用继承,系统会默认的继承Object类
class A{
}
class A extends Object{
}
两者都是创建A类
a,继承语法初始化基类
package com.wj.reuse; /** * * @author Administrator 继承语法,初始化基类,带参数的构造器 */ public class DemoExtends extends DemoExtendsMain { public static void main(String[] args) { //创建对象 new DemoExtends(); } } //创建基类 class DemoExtendsMain { //初始化基类 DemoExtendsMain() { System.out.println("初始化基类"); } }
运行结果:
初始化基类
b:继承语法代参数的构造器
package com.wj.reuse; /** * * @author Administrator 继承语法,初始化基类,带参数的构造器 */ public class DemoExtends extends DemoExtendsMain { DemoExtends(int i) { super(i); // TODO Auto-generated constructor stub } public static void main(String[] args) { //创建对象 new DemoExtends(5); } } //创建基类 class DemoExtendsMain { //初始化基类 DemoExtendsMain(int i) { System.out.println("带参数的构造器"); } }
运行结果:
带参数的构造器
三:代理 作者讲的代理就是继承和组合的中庸之道
代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问,相当于操作私有方法
a,没有代理模式的:
package com.wj.reuse; /*8 * java的代理模式的使用 */ public class ProxyClass extends ProxySon { public static void main(String[] args) { new ProxyClass().get(); } } // 基类 class ProxySon { public void get() { System.out.println("基类的方法"); } }
运行结果:
基类的方法
b,有代理模式的
package com.wj.reuse; /*8 * java的代理模式的使用, *代理模式 解决了在子类中不能直接操作 而是通过间接的调用,保证了数据的安全性 */ public class ProxyClass extends ProxySon { public static void main(String[] args) { // 创建对象,调用代理类的get()方法 new ProxyClass().Proxyget(); } } // 基类 class Son { public void get() { System.out.println("基类的方法"); } } // 定义代理的类 class ProxySon { // 创建基类 private Son son = new Son(); // 创建代理类的方法 public void Proxyget() { // 调用基类的方法 son.get(); } }
运行结果:
基类的方法
分析:
在没有代理模式中,继承Son类后直接调用get()方法,不利于数据的安全
有代理模式中,使用代理类来操作基类的数据,子类继承代理类,子类在操作中不能够直接操作到数据,必须通过代理类来操作
四:重写和重载
重写:重新覆盖父类的方法
package com.wj.reuse; /* * 重写和重载的简单使用 */ class Demo {// 定义基类 String s;// 接收参数 // 定义方法 public void getSize(String str) { s = str; System.out.println(s);// 打印 } } // 重写Demo类中的getSize()方法 public class OvverideDemo extends Demo { String name; @Override public void getSize(String name) { // super.getSize(str);super是调用父类中的getSize()方法 this.name = name; System.out.println(name); } // 创建主函数 public static void main(String[] args) { // 创建对象,调用重写的方法 new OvverideDemo().getSize("java"); } }
运行结果:java
OvverideDemo继承Demo,并且重写Demo中的getSize()方法;这就是重写
重载:方法名相同,参数不同
package com.wj.reuse; /*8 * 重载 ,方法名相同,参数不同 */ //定义基类 class loadeDemo { String name; int age; //定义三个重载的方法 public void getPeople(String name) { this.name = name; System.out.println("name:"+name); } public void getPeople(int age) { this.age = age; System.out.println("age:"+age); } public void getPeople(String name, int age) { this.name = name; this.age = age; System.out.println("name:"+name+" age:"+age); } } //重载 public class Overloade extends loadeDemo{ public static void main(String[] args) { //创建对象,调用基类的getSize()方法 new Overloade().getPeople("java",90); } }
运行结果:
name:java age:90
五:final关键字
final 类 不能被继承
final 方法 不能被子类覆盖,但可以继承
package com.wj.reuse; /* * 重写和重载的简单使用 */ class Demo {// 定义基类 String s;// 接收参数 // 使用final 定义方法 public final void getSize(String str) { s = str; System.out.println(s);// 打印 } } // 重写Demo类中的getSize()方法 public class OvverideDemo extends Demo { String name; @Override //基类中使用final定义的方法,子类中是不可以重写(覆盖) public void getSize(String name) {//有错 // super.getSize(str);super是调用父类中的getSize()方法 this.name = name; System.out.println(name); } // 创建主函数 public static void main(String[] args) { // 创建对象,调用重写的方法 new OvverideDemo().getSize("java"); } }
final 变量 只能有一次赋值,赋值后不能改变
final 不能用来修饰构造方法
六:继承与初始化
package com.wj.reuse; //类的继承与初始化 class InitA {// 定义基类 public InitA() {// 定义构造方法 System.out.println("InitA"); } // 定义i的值 public static int i = point(); public static int point() { System.out.println("InitA+point"); return 1; } } // 继承A class InitB extends InitA { // 初始化 public InitB() { System.out.println("InitB"); } { System.out.println("InitB+20"); } // static代码块 static { System.out.println("InitB+static"); } } // 继承InitB public class InitDemo extends InitB { // 构造方法 public InitDemo() { System.out.println("InitDemo"); } // 代码块输出 { System.out.println("InitDemo+20"); } public static void main(String[] args) { // 整型输出 int n = 10; System.out.println(n); // 创建对象 输出 new InitDemo(); System.out.println("main"); } }
运行结果:
InitA+point
InitB+static
10
InitA
InitB+20
InitB
InitDemo+20
InitDemo
main
程序运行时的执行顺序:左边的最先执行
static和static代码块-->属性-->非静态代码块--->构造方法-->mian方法中的输出语句-->方法