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