Java 从其他类访问受保护字段

Java 从其他类访问受保护字段,java,Java,对于下面的代码,我可以访问SeatPlan类的受保护字段,并从教室类更改其值,这看起来对这些数据不安全 这正常吗?难道不是只有它的子类才能访问受保护的字段吗?否则我需要将它们更改为private字段 假设我有一个抽象类,其中包含受保护的字段: public abstract class SeatPlan { protected int rowNum; protected int columnNum; public abstract void method(); }

对于下面的代码,我可以访问
SeatPlan
类的受保护字段,并从
教室
类更改其值,这看起来对这些数据不安全

这正常吗?难道不是只有它的子类才能访问受保护的字段吗?否则我需要将它们更改为
private
字段


假设我有一个
抽象
类,其中包含
受保护的
字段:

public abstract class SeatPlan {
    protected int rowNum;
    protected int columnNum;

    public abstract void method();
}
然后它有子类:

public class ASeatPlan extends SeatPlan {
    public ASeatPlan(){            // constructor
        this.rowNum= 10; 
        this.columnNum = 7;
    }
    // omitted code
}

public class BSeatPlan extends SeatPlan {
    public BSeatPlan(){            // constructor
        this.rowNum= 7;
        this.columnNum = 15;
    }
    // omitted code
}
class
Room
包含
SeatPlan
对象的
private
字段:

public class Room {
    private SeatPlan seatPlan;

    public Room(SeatPlan seatPlan){       // constructor
        this.seatPlan = seatPlan;
    }

    public SeatPlan getSeatPlan(){     // getter method
        return seatPlan;
    }

    //omitted code
}

public class Classroom {
    public SeatPlan doSomething(Room room){
        SeatPlan seats = Room.getSeatPlan();
        seats.rowNum = 99999;     <--------------- accidentally change the value ------

    //omitted code
    }
公共教室{
私人海图海图;
公共房间(SeatPlan SeatPlan){//
this.seatPlan=seatPlan;
}
公共SeatPlan getSeatPlan(){//getter方法
返回海图;
}
//省略代码
}
公共课堂{
公共座椅平面剂量仪(房间){
SeatPlan seats=Room.getSeatPlan();

seats.rowNum=99999;我想你把C#和Java搞混了

在C#中,
protected
stuff只能通过子类访问。但在Java中,
protected
stuff可以在同一个包或子类中访问

这就是为什么您可以从教室更改座椅平面的值

这不安全吗

在我看来,是的。我认为你不应该改变座位计划的行数和列数

我如何使它安全

你应该重新设计你的座位计划课程。这里有一个大致的想法:

public final class SeatPlan {
    private SeatPlan(int rowNum, int colNum) {
        this.rowNum = rowNum;
        this.colNum = colNum;
    }

    private int rowNum;
    private int colNum;

    //You should add getters for rowNum and colNum here
    //But I'm lazy so I did not do it for you

    public static final SeatPlan PLAN_A = new SeatPlan(10, 7);
    public static final SeatPlan PLAN_B = new SeatPlan(7, 15);
}

我认为你把C#和Java混淆了

在C#中,
protected
stuff只能通过子类访问。但在Java中,
protected
stuff可以在同一个包或子类中访问

这就是为什么您可以从教室更改座椅平面的值

这不安全吗

在我看来,是的。我认为你不应该改变座位计划的行数和列数

我如何使它安全

你应该重新设计你的座位计划课程。这里有一个大致的想法:

public final class SeatPlan {
    private SeatPlan(int rowNum, int colNum) {
        this.rowNum = rowNum;
        this.colNum = colNum;
    }

    private int rowNum;
    private int colNum;

    //You should add getters for rowNum and colNum here
    //But I'm lazy so I did not do it for you

    public static final SeatPlan PLAN_A = new SeatPlan(10, 7);
    public static final SeatPlan PLAN_B = new SeatPlan(7, 15);
}

你需要理解访问修饰符。这里有一个简单的教程:代码的简单解决方案这是最好的解决方案,因为你需要知道如何在每个Java项目中使用修饰符。你可能需要理解访问修饰符。这里有一个简单的教程:简单的这是最好的解决方案,因为您需要知道如何为每个Java项目使用修饰符。