java - 在java中使用 'this'关键字和扩展类

标签 java class this extends

我有一个名为“Items”的类,“Equips”从该类扩展,“Helmet”从“Equips”扩展。我有一个名为“getStats”的方法,它从 .txt 文件加载项目的统计信息。如果我将“getStats”方法放在“Items”类中,则我尝试使用“this”访问“Helmet”对象中的任何字段。显示为空。在加载文本文件之前创建 Helm 时,我尝试在“ Helm ”中访问的字段会被初始化。我可以很容易地将“getStats”方法放入“Equips”类中,并在“Items”类中放入一个空白的“getStats”方法,但我想知道是否有一种方法可以让它按原样工作。提前致谢!

Items.java:

package com.projects.aoa;

import static com.projects.aoa.Print.*;

import java.util.*;
import java.io.*;

class Items {

String name, type;
int id;
int hp, mp, str, def;
boolean vacent;

static void getAllStats(Items[] e){
    for(Items i : e){
        getItemStats(i);
    }
}

static void getItemStats(Items i){
    i.getStats();
}

void getStats(){
    try {
        //System.out.println(System.getProperty("user.dir"));

        print(this.name); //THIS shows up as null as well as those \/below\/
        FileInputStream fstream = new FileInputStream(System.getProperty("user.dir") 
                + "/src/com/projects/aoa/" + this.type + this.name + ".txt");

        DataInputStream in = new DataInputStream(fstream);

        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String line;
        int counter = 0;

        while ((line = br.readLine()) != null) {
            if (line.length() == 0){
                break;
            }

            switch (counter) {
            case 0:
                this.hp = Integer.parseInt(line);
                counter++;
                break;
            case 1:
                this.mp = Integer.parseInt(line);
                counter++;
                break;
            case 2:
                this.def = Integer.parseInt(line);
                counter++;
                break;
            case 3:
                this.str = Integer.parseInt(line);
                counter++;
                break;
            }   
        }


        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Game.java:

Helmet headBand = new Helmet("HeadBand");
Helmet bronzeHelmet = new Helmet("BronzeHelmet");


    Items[] equips = {
            headBand, bronzeHelmet
    };



    getAllStats(equips);

Equips.java:

  package com.projects.aoa;

import static com.projects.aoa.Print.print;
import static com.projects.aoa.Print.println;

import java.io.*;



class Equips extends Items{
    String name, type;
    int hp, mp, str, def;




    void printStats(){
        println("[" + name + "]");
        println("Type: " + type);
        println("HP:  " + hp);
        println("MP:  " + mp);
        println("Def: " + def);
        println("Str: " + str);
    }
}

class Helmet extends Equips {
    Helmet(String name){
        this.name = name;
        this.type = "h_";
    }
}

最佳答案

您还没有向我们展示您的 Helmet 类,因此很难说发生了什么 - 但我猜测是您正在重新声明具有相同名称的字段在 Helm 中。这些将隐藏 Items 中的字段,而您实际上只想使用 Items 中的字段。

这是一个简短但完整的示例,它演示了我认为正在发生的事情:

class SuperClass {
    String name;

    public void setName(String newName) {
        // This writes to the field in SuperClass
        name = newName;
    }
}

class SubClass extends SuperClass {
    // This *hides* the field in SuperClass
    String name;

    public void showName() {
        // This reads the field from SubClass, which
        // nothing writes to...
        System.out.println("My name is " + name);
    }
}

public class Test {
    public static void main(String[] args) {
        SubClass x = new SubClass();
        x.setName("Test");
        x.showName();
    }
}

我建议:

  • 您将所有字段设为私有(private),编写属性以根据需要授予对其他类的访问权限
  • 您删除了 Helmet 中隐藏 Items 中字段的字段
  • 您更改类名称以避免复数 - ItemEquipment 而不是 Items

这是上述代码的修复版本:

class SuperClass {
    private String name;

    public void setName(String newName) {
        name = newName;
    }

    public String getName() {
        return name;
    }
}

class SubClass extends SuperClass {
    public void showName() {
        System.out.println("My name is " + getName());
    }
}

public class Test {
    public static void main(String[] args) {
        SubClass x = new SubClass();
        x.setName("Test");
        x.showName();
    }
}

(显然,您还需要考虑对属性等设置哪些访问权限,但这是一个单独的问题。)

关于java - 在java中使用 'this'关键字和扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441656/

相关文章:

java - 复制数组

c++ - 删除这个然后返回创建的对象

java - 如何从 Java 中的 CopyOnWriteArrayList 中获取底层静态数组?

java - 如何在 Mule 中使用 XStream?

java - 用于在 hdfs 中列出目录的主机和端口

Javascript类构造的对象未定义

java - Class.forName() 与直接类加载

c++ - char[] 上的一元运算符

javascript - 使用父函数jquery显示类名

java - "this"的重要性