Java 如何在不使用String/toString的情况下获取对象而不是地址?
我需要创建自己的Java 如何在不使用String/toString的情况下获取对象而不是地址?,java,string,overriding,tostring,Java,String,Overriding,Tostring,我需要创建自己的String类,名为MyString,而不使用默认的字符串类/向量API。我必须研究一些必需的方法,它们的返回类型是预先确定的。我可以添加其他方法,只要不使用String 预期用途为: (在main中)System.out.println(str.toLowerCase())-返回str的小写 当我想使用返回类型为MyString的toLowerCase()方法时,我不能返回对象内容,只能返回地址 通常,此问题需要修改toString(),但由于此方法在默认情况下需要返回字符串类
String
类,名为MyString
,而不使用默认的字符串类/向量API。我必须研究一些必需的方法,它们的返回类型是预先确定的。我可以添加其他方法,只要不使用String
预期用途为:
(在main中)System.out.println(str.toLowerCase())
-返回str的小写
当我想使用返回类型为MyString
的toLowerCase()
方法时,我不能返回对象内容,只能返回地址
通常,此问题需要修改toString()
,但由于此方法在默认情况下需要返回字符串类型,因此我无法对赋值使用修改toString()
任务应该不那么难,也不需要复杂的扩展。我的构造函数可能是问题所在,但我无法指定哪个部分是
代码
public class MyString {
private char value[];
MyString(char[] arr){
this.value = Arrays.copyOf(arr, arr.length);
}
...
MyString toLowerCase() { // can't change return type
for (int i =0; i<value.length; i++) {
if ((int)value[i] > 64 && (int)value[i] < 91) {
value[i] = (char) (value[i]+32);
}
}
return this; // this returns address, and I can't override toString
}
公共类MyString{
私有字符值[];
MyString(char[]arr){
this.value=Arrays.copyOf(arr,arr.length);
}
...
MyString toLowerCase(){//无法更改返回类型
对于(int i=0;i 64&(int)值[i]<91){
值[i]=(字符)(值[i]+32);
}
}
返回此;//此返回地址,我无法重写toString
}
System.out.println(str.toLowerCase())
的问题在于它最终调用了PrintStream.println(对象o)
,但该方法在某些时候内部调用了o.toString()
,它使用从对象继承的代码#toString()
(因为您不能像预期的那样重写toString
,结果String
,这在您的项目中是被禁止的),从而导致表单TypeInfo@hexHashCode
这意味着您不能使用System.out.println(MyString)
但是PrintStream
(哪个实例由System.out
持有)允许我们提供以不同形式打印的数据。在这种情况下,您可以使用。您需要做的就是添加到MyString
方法,如tocharray()
,该方法将返回(最好是MyString
类持有的字符数组
通过这种方式,您可以像System.out.println(myStringInstance.toCharArray())
那样使用它,因此main
方法中的代码需要如下所示
System.out.println(str.toLowerCase().toCharArray());
// ^^^^^^^^^^^--this should return char[]
首先,String
类是一个不可变的类型,即String
的方法不会更改内部状态(即char
数组),而是返回类型为String
的新实例。
要镜像该行为,您可以实现如下内容:
public MyString toLowerCase() {
char temp = new char[value.length];
// [...] Your code performing the actual logic on temp
return new MyString(temp);
}
void shortenString(String inputAndOutput);
String
类的不变性(及其含义)在实践中理解是非常重要的。例如,以下代码处理预期结果:
String word = "Word";
System.out.println("I can produce upper case (" + word.toUpperCase() + ") " +
"and lower case (" + word.toLowerCase() + ") " +
"without any side-effects on the original (" + word + ").");
但是,不可能(没有“黑客”解决方案)实现这样的方法:
public MyString toLowerCase() {
char temp = new char[value.length];
// [...] Your code performing the actual logic on temp
return new MyString(temp);
}
void shortenString(String inputAndOutput);
其次,赋值要求必须按如下方式使用类/方法:
System.out.println(str.toLowerCase());
属性out
实际上是一个函数,它提供(除其他方法外)以下两种:
println(对象x)
-打印一个对象,然后终止该行
println(String x)
-打印一个字符串,然后终止该行
如果使用对象
参数调用该方法,则内部实现在给定对象上调用toString()
,因此满足要求的唯一方法是重写该方法。不幸的是,赋值不允许这样做
但是,如果没有明确说明解决方案必须使用java.lang.System
,您可以简单地实现自己的System
类,该类接受MyString
,例如:
public class System {
public static class MyPrintStream /* optional: extends PrintStream */ {
public void println(MyString x) {
java.lang.System.out.println(x.getCharArray());
}
}
public static final out = new MyPrintStream();
}
这将允许您完全按照作业中的描述使用:
import my.package.System;
public class Main {
public static void main(String[] args) {
// [...] Instantiate str
System.out.println(str.toLowerCase());
}
}
与内部java类交互的唯一方法是通过指定的API -<代码> toString 是API的一部分。没有其他方法来描述您想如何打印类作为<代码>字符串< /> >。您可以考虑添加<代码>打印机> < /C>装饰器->代码> MyString PrimTrrItter < /Cord>,使用某种方法来进行T创建一个MyString
并通过char
将其输出到char
@aka-one为什么?MyString
可以是可变的。String
不可变不会影响自定义实现。@aka-one不确定我是否理解您的观点。类的可变性或不可变性会影响它的共享方式。这不会影响共享内容方法需要实现,只需要实现它们的方式。如果你想编写自己的字符串类,你必须以任何一种方式重新对所有方法进行采样。虽然string
是不可变的,但没有任何迹象表明他自己的MyString
类也必须是不可变的。我假设这个赋值的主要目的是为了了解String
类的概念和内部结构,其中一个非常重要的概念是不变性。