您的位置:首页 > 编程语言 > Java开发

疯狂JAVA讲义---第六章(中):面向对象二

2008-12-27 19:08 387 查看
这本书对java的每个知识点分析的比较细,虽说不用知道所有的知识点你也可以写代码,但写代码总是仿照他人的标准格式却不知道为什么。这样会使人觉得写代码是一种负担,还要背出那么多的语法,一旦你掌握了细节,写代码时你会觉得那些语法自然而然的就出来了,不用死记。

这章中间讲了抽象类和接口,抽象方法没有方法体,所以不用加花括号,接口的方法也一样,具体作用我在前几天写的blog《面向对象的重要概念》中已经讲的非常清楚了,这里就补充下书中的例子,eg(抽象类)

public abstract class SpeedMeter

{

    //转速

    private double turnRate;

    public SpeedMeter()

    {

    }

    //把返回车轮半径的方法定义成抽象方法

    public abstract double getRadius();

    public void setTurnRate(double turnRate)

    {

        this.turnRate = turnRate;

    }

    //定义计算速度的通用算法

    public double getSpeed()

    {

        //速度等于 车轮半径 * 2 * PI * 转速

        return java.lang.Math.PI * 2 * getRadius() * turnRate;

    }

}

public class CarSpeedMeter extends SpeedMeter

{

    public double getRadius()

    {

        return 0.28;

    }

    public static void main(String[] args) 

    {

        CarSpeedMeter csm = new CarSpeedMeter();

        csm.setTurnRate(15);

        System.out.println(csm.getSpeed());

    }

}

eg(接口)

interface interfaceA

{

    int PROP_A = 5;

    void testA();

}

interface interfaceB

{

    int PROP_B = 6;

    void testB();

}

interface interfaceC extends interfaceA, interfaceB

{

    int PROP_C = 7;

    void testC();

}

public class TestInterfaceExtends 

{

    public static void main(String[] args)

    {

        System.out.println(interfaceC.PROP_A);

        System.out.println(interfaceC.PROP_B);

        System.out.println(interfaceC.PROP_C);

    }

}

抽象类是一种模板式的设计,接口是一种规范。
面向接口编程实例,eg(工厂模式)

public class Computer

{

    private Output out;

    public Computer(Output out)

    {

        this.out = out;

    }

    //定义一个模拟获取字符串输入的方法

    public void keyIn(String msg)

    {

        out.getData(msg);

    }

    //定义一个模拟打印的方法

    public void print()

    {

        out.out();

    }

}

public class OutputFactory

{

    public Output getOutput()

    {

        //下面两行代码用于控制系统到底使用Output的哪个实现类。

        //return new Printer();

        return new BetterPrinter();

    }

    public static void main(String[] args) 

    {

        OutputFactory of = new OutputFactory();

        Computer c = new Computer(of.getOutput());

        c.keyIn("轻量级J2EE企业应用实战");

        c.keyIn("Struts2权威指南");

        c.print();

    }

}

public class BetterPrinter implements Output

{

    private String[] printData = new String[MAX_CACHE_LINE * 2];

    //用以记录当前需打印的作业数

    private int dataNum = 0;

    public void out()

    {

        //只要还有作业,继续打印

        while(dataNum > 0)

        {

            System.out.println("高速打印机正在打印:" + printData[0]);

            //把作业队列整体前移一位,并将剩下的作业数减1

            System.arraycopy(printData , 1, printData, 0, --dataNum);

        }

    }

    public void getData(String msg)

    {

        if (dataNum >= MAX_CACHE_LINE * 2)

        {

            System.out.println("输出队列已满,添加失败");

        }

        else

        {

            //把打印数据添加到队列里,已保存数据的数量加1。

            printData[dataNum++] = msg;

        }

    }

}

又学到一招,当内部类和外部类的属性或方法同名时可以用以下例子中的,外部类名.this来引用。eg,
public class DiscernVariable
{
    private String prop = "外部类属性";
    private class InClass
    {
        private String prop = "内部类属性";
        public void info()
        {
            String prop = "局部变量";
            //通过 外部类类名.this.varName 访问外部类实例属性
            System.out.println("外部类的属性值:" + DiscernVariable.this.prop);
            //通过 this.varName 访问外内部类实例的属性
            System.out.println("内部类的属性值:" + this.prop);
            //直接访问局部变量
            System.out.println("局部变量的属性值:" + prop);
        }
    }
    public void test()
    {
        InClass in = new InClass();
        in.info();
    }
    public static void main(String[] args) 
    {
        new DiscernVariable().test();
    }
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息