Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 如何在不使用String/toString的情况下获取对象而不是地址?_Java_String_Overriding_Tostring - Fatal编程技术网

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
类的概念和内部结构,其中一个非常重要的概念是不变性。