`

4、类与对象之继承、组合、代理

    博客分类:
  • java
 
阅读更多

此章我们主要谈下面向对象编程的代码复用机制。

继承

继承是OOP中最为重要的概念,达到了非常有效的代码重用效果,使得开发效率变得很高!在Java语言中,两个类之间通过extends关键字实现继承。

class A {  
    public A() {  
        System.out.println("A()!");  
    }  
}  
class B extends A {  
    public B() {  
        System.out.println("B()!");  
    }  
}   
public class ExtendsTest extends B {    
    public ExtendsTest() {  
        System.out.println("ExtendsTest()!");  
    }  
    public static void main(String[] args) {  
        new ExtendsTest();  
    }  
}  

ExtendsTest继承自B,B继承自A,当实例化ExtendsTest的时候,依次打印出A、B、ExtendsTest构造器中的内容,说明:构造器被依次调用了;当子类实现继承时,相当于父类给子类一个实例,故先构造实例,实验中得出结论:在对子类进行初始化的时候,会先调用父类的构造器,如果父类构造器需要传递参数,则使用super关键字来实现就行了。

 

1、子类不能继承父类私有的域(属性)或者方法。如果想要继承父类的私有对象,只能将private改成protected,因为protected的权限控制在包内。因此一般情况,用到继承的话,最好将父类中的域声明为私有(private,因为一般情况不需要继承成员变量),将方法声明为public,方便继承。

2、当调用子类方法,如果子类有,则屏蔽父类方法;,如果子类没有,则去调用父类的同名方法,但是调用者保持是子类。

 

代理

代理的思想在我们讲得设计模式里面有体现,就是在一个类中持有另一个类的实例,从而代替原类进行一个操作,我们看个例子:

public class ProxyTest {  
    Source source = new Source();  
    void p(int n){  
        source.a(n);  
    }  
    void p2(int n){  
        source.b(n);  
    }  
    public static void main(String[] args) {  
        ProxyTest pt = new ProxyTest();  
        pt.p(20);  
        pt.p2(50);  
    }  
}  
class Source{  
    void a(int n){  
        System.out.println("this is : "+n);  
    }  
    void b(int n){  
        System.out.println("this is : "+n);  
    }  
}  

 组合

如果大家还记得设计模式里的建造者模式,那么很容易联想到组合机制,就是将一系列的对象组合在一起,组合成一个功能丰富的类,当然,这些对象包括基本数据类型,也包括引用。来看个例子:

class Soap{  
    private String s;  
    Soap(){  
        System.out.println("soap");  
        s = "constructor";  
    }  
    public String toString(){  
        return s;  
    }  
}  
public class CompronentTest {  
    private String s1 = "happy",s2="Happy",s3,s4;  
    private Soap castille;  
    private int i;  
    public CompronentTest(){  
        s3 = "joy";  
        castille = new Soap();  
    }  
    {  
        i = 88;  
    }  
    public String toString(){  
        if(s4 == null){  
            s4 = "Joy";  
        }  
            return "s1 = " + s1 + "\n" +  
                   "s2 = " + s2 + "\n" +  
                   "s3 = " + s3 + "\n" +  
                   "s4 = " + s4 + "\n" +  
                   "i = " + i + "\n" +  
                   "castille = " + castille;  
  
    }  
    public static void main(String[] args) {  
        CompronentTest ct = new CompronentTest();  
        System.out.println(ct);  
    }  
}  

 懒加载涉及持有对象实例,所以会涉及到懒加载的机制,代码中的:

if(s4 == null){

         s4 = "Joy";

}

就是一种懒加载的机制,这种机制就是解决当所需的对象比较庞大的时候,只有在用的时候才去初始化,节省空间,提高效率!

Java中跳出循环的方法:

break是跳出当前for循环,switch语句;

break会跳出(终止)当前循环,continue是跳出当前循环,开使下一循环;

以上两种方法没有办法跳出多层循环,如果需要从多层循环跳出,则需要使用标签,定义一个标签label,然后再需要跳出的地方,用break label就行了,代码如下:

public class RecTest {  
    public static void main(String[] args) {  
          loop: for (int i = 0; i < 10; i++) {  
            for (int j = 0; j < 10; j++) {  
                for (int k = 0; k < 10; k++) {  
                    for (int h = 0; h < 10; h++) {  
                        if (h == 6) {  
                            break loop;  
                        }  
                        System.out.print(h);  
                    }  
                }  
            }  
        }  
        System.out.println("\nI'm here!");  
    }  
}  

012345

I'm here! 

continue同理;

012345 012345 012345 012345 012345 012345 012345 012345 012345 012345   //h=6时,跳到loop,执行下一个for命令;

I'm here!

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web服务定义 210 13.5.3 Web服务代码 213 13.5.4 Invoice.cs 214 13.5.5 Invoice.vb 215 13.6 小结 216 13.7 参考书目 216 第14章 对象和客户/服务器应用...

    设计模式:可复用面向对象软件的基础--详细书签版

    当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。    另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它...

    Java 基础核心总结 +经典算法大全.rar

    多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 Throwable 常见的 Exception 与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部...

    12种常用设计模式C#代码示例

    4,工厂方法模式:定义一个创建对象的接口,但由子类觉得要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 5,抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 6,...

    浅析java常用的设计模式(doc-23页).doc

    客户端分辨不出代理主题对象与 真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象 的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代 为创建并传入。 13...

    设计模式画图程序

    虽然圆形、矩形和按钮是不同的类,但他们都继承于 Paint 类的,那么使用享元模式(享元类为:FlyWeight)就不会出错了。 2.1.3 组合模式 在这个系统中,我们使用组合模式来实现画组合图。在组合模式中,客户端可以...

    设计模式经典样例笔记与代码Swift.zip

    继承的概念被用来组合接口和定义组合对象获得新功能的方式。 [x] 适配器模式 [x] 桥接模式 [x] 过滤器模式 [x] 组合模式 [x] 装饰器模式 [x] 外观模式 [x] 享元模式 [x] 代理模式 行为型 这些设计模式特别关注对象...

    Java2核心技术.part4

    第4章对象与类 4.1面向对象程序设计概述 4.1.1 OOP词汇表 4.1.2对象 4.1.3类之间的关系 4.1.4 00P与传统的过程化程序设计技术对比 4.2使用现有类 4.2.1对象与对象变量 4.2.2 Java库中的...

    疯狂JAVA讲义

    5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 ...

    软件设计模式知识点

    软件设计模式知识点 软件设计模式是解决软件设计问题的一种方法,旨在提高软件系统的灵活性、可维护性和可重用性。软件设计模式可以分为三类:...7. 合成聚合复用原则(CARP):优先使用对象合成/聚合,而不是类继承。

    33种JAVA设计模式DEMO

    继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式...

    超级有影响力霸气的Java面试题大全文档

    对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以...

    C#设计模式 C# Design Patterns:A Tutorial

    第4章 在C#中使用类和对象 第5章 继承 · · · · · · (更多) 第一部分 C#面向对象程序设计 第1章 设计模式概述 第2章 C#语言的语法 第3章 用C#编写Windows程序 第4章 在C#中使用类和对象 第5章 继承 第6章 UML...

    GoF 的 23 种设计模式

    它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。 外观(Facade)模式:为多个复杂的子系统提供一个...

    设计模式 GOF 23

    当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。 另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了...

    二十三种设计模式【PDF版】

    使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...

    Java2核心技术.part5

    第4章对象与类 4.1面向对象程序设计概述 4.1.1 OOP词汇表 4.1.2对象 4.1.3类之间的关系 4.1.4 00P与传统的过程化程序设计技术对比 4.2使用现有类 4.2.1对象与对象变量 4.2.2 Java库中的...

Global site tag (gtag.js) - Google Analytics