Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助我理解关于实现接口的这一课_Java_Interface - Fatal编程技术网

Java 帮助我理解关于实现接口的这一课

Java 帮助我理解关于实现接口的这一课,java,interface,Java,Interface,我对更流利地使用Java很感兴趣,所以我一直在学习。我在“实现接口”一节中,我不理解他们作为其中一个练习的解决方案给出的代码 实现java.lang.CharSequence接口时,实现应该向后返回字符串,并编写一个小的main方法来测试类;确保调用所有四个方法 这是一个有点压倒性的,所以我开始通过他们的解决方案,看看我是否可以理解的概念和他们的代码。以下是我的问题: 1当他们实现charAt方法时,返回charAt方法的调用,为什么这不会导致某种无限循环 提前谢谢 代码如下: /* Copyr

我对更流利地使用Java很感兴趣,所以我一直在学习。我在“实现接口”一节中,我不理解他们作为其中一个练习的解决方案给出的代码

实现java.lang.CharSequence接口时,实现应该向后返回字符串,并编写一个小的main方法来测试类;确保调用所有四个方法

这是一个有点压倒性的,所以我开始通过他们的解决方案,看看我是否可以理解的概念和他们的代码。以下是我的问题:

1当他们实现charAt方法时,返回charAt方法的调用,为什么这不会导致某种无限循环

提前谢谢

代码如下:

/* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. */
// CharSequenceDemo presents a String value -- backwards.
public class CharSequenceDemo implements CharSequence {
    private String s;

    public CharSequenceDemo(String s) {
        //It would be much more efficient to just reverse the string
        //in the constructor. But a lot less fun!
        this.s = s;
    }

    //If the string is backwards, the end is the beginning!
    private int fromEnd(int i) {
        return s.length() - 1 - i;
    }

    public char charAt(int i) {
        if ((i < 0) || (i >= s.length())) {
        throw new StringIndexOutOfBoundsException(i);
        }
        return s.charAt(fromEnd(i));
    }

    public int length() {
        return s.length();
    }

    public CharSequence subSequence(int start, int end) {
        if (start < 0) {
        throw new StringIndexOutOfBoundsException(start);
        }
        if (end > s.length()) {
        throw new StringIndexOutOfBoundsException(end);
        }
        if (start > end) {
        throw new StringIndexOutOfBoundsException(start - end);
        }
        StringBuilder sub = 
        new StringBuilder(s.subSequence(fromEnd(end), fromEnd(start)));
        return sub.reverse();
    }

    public String toString() {
        StringBuilder s = new StringBuilder(this.s);
        return s.reverse().toString();
    }

    //Random int from 0 to max.
    private static int random(int max) {
        return (int) Math.round(Math.random() * max + 0.5);
    }

    public static void main(String[] args) {
        CharSequenceDemo s =
        new CharSequenceDemo("Write a class that implements the CharSequence interface found in the java.lang package.");

        //exercise charAt() and length()
        for (int i = 0; i < s.length(); i++) {
        System.out.println(s.charAt(i));
        }

        //exercise subSequence() and length();
        int start = random(s.length() - 1);
        int end = random(s.length() - 1 - start) + start;
        System.out.println(s.subSequence(start, end));

        //exercise toString();
        System.out.println(s);

    }
}

对charAt的嵌套调用是对s.charAt的,这意味着您正在对另一个对象调用相同的方法。没有无限循环

它们的fromEnd定义为

  private int fromEnd(int i) {
        return s.length() - 1 - i;
    }
几乎在顶端

1当他们执行字符时 方法,则返回 调用charAt方法,为什么 这不是导致了某种 无限循环

没有无限循环,因为这些方法引用两个完全不同的对象

该接口为CharSequence定义charAt签名。本例中的实现有一个支持字符串实例。CharSequence的实现调用支持字符串实例的charAt方法。没有无限循环,因为它不调用这个.charAt

charAt实际上不是递归的,它为String s调用String类的charAt方法。 fromEndi是对fromEndint i方法的方法调用,该方法也在类中定义 -


因此,s.charAtfromEndi实际上是从java.lang.String调用charAt方法,因为s是一个String对象?如果我更改了变量名:CharSequenceDemo s=new CharSequenceDemo,请编写一个实现java.lang包中的CharSequence接口的类。;为此CharSequenceDemo varString=new CharSequenceDemo编写一个实现java.lang包中的CharSequence接口的类。;我只需要更改主方法中包含的内容,对吗?我想可能是因为他们使用了两次,这让我很困惑,或者我是不是太离谱了?s.charAt调用的是字符串对象charAt,与您声称的方法不同。
//If the string is backwards, the end is the beginning!
    private int fromEnd(int i) {
        return s.length() - 1 - i;
    }