关于Java“属性”和C#属性之间的区别
本文关键字:属性 之间 区别 Java 关于 | 更新日期: 2023-09-27 17:56:55
作为实习的一部分,我在C#工作了整整六个月。我在实习中学到的是 C# 属性、AKA 二传手和获取者的美感。在实习之初,属性也是我困惑的根源,但使用了一段时间,我爱上了它。
回到Java上课,我不得不告别它。
直到。。我开始了这个简单的作业:
我的方法和构造函数:
private double xCoor;
private double yCoor;
public Point(double xCoor, double yCoor)
{
this.xCoor = xCoor;
this.yCoor = yCoor;
}
public void setCoor(double xCoor, double yCoor)
{
this.xCoor = xCoor;
this.yCoor = yCoor;
}
public void printCoor()
{
System.out.println("(" + xCoor + ", " + yCoor + ")");
}
为了演示,这是我的主要方法:
Point pointOne = new Point(6.0, 7.0);
pointOne.printCoor();
pointOne.setCoor(9.0, 3.0);
pointOne.xCoor = 9.0;
pointOne.yCoor = 7.0;
System.out.println("Java Properties: " + pointOne.xCoor);
System.out.println("Java Properties: " + pointOne.yCoor);
如您所知,以Point pointOne = ..;
开头的前三行是"Java"的做事方式。您可以看到 getter 采用 print 语句的形式,而 setter 则采用 .setCoor(..)
的形式。
现在,我的问题是,在 Java 中(我刚刚学会了) - 您还可以通过类似属性的声明通过 pointOne.xCoor = ..
设置私有变量,当然,通过与 pointOne.xCoor
相同的方式获取它们。
我知道与 C# 的方式存在这种差异,因为可以手动声明属性的名称,就像这样(如果是 C#)。
public string XCoor
{
get { return this.xCoor; }
set { xCoor = value; }
}
有人可以帮助我理解 Java 处理属性的方式和 C# 方式之间的区别吗?
在 java 中,如果没有公共 getter 和 setter 方法,则无法从另一个类设置私有字段。没有 getter 和 setter 方法的私有字段只能在同一类中设置和查看。
例如
public class A {
private int a;
private int b;
private int c;
public int s;
public A(){
a=5; // In same class
b=3; // In same class
c=7;
s=9;
}
public int sum(){
return a+b; // I can access a and b directly, because we are in the same class with them.
}
public getC(){
return c; // Other classes can read value of c with this public method
}
public setC(int value){
c=value; // Other classes can set value of c with this public method
}
}
public class B{
private A obj = new A(); //
public void someMethod(){
int t = obj.getC(); // this is ok
int g = obj.s; // this is ok because s is public
int f = obj.c // compiler error, c is private, i can't see it from another class directly
int p = obj.a // compiler error, a is private, i can't see it from another class directly
}
}
现在,我的问题是,在Java中(我刚刚学会了) - 你也可以通过pointOne.xCoor = ..通过类似属性的声明来设置私有变量,当然,通过与pointOne.xCoor相同的方式获取它们。
不同之处在于,如果你想在设置xCoor
时发生一些特殊的行为,那么在 Java 中是不可能的,除非你确保人们总是通过"getter"和"setter"方法访问这个字段:
point.setXCoor(1);
在 C# 中,只需更改属性的实现:
public string XCoor
{
get { return this.xCoor; }
set {
if(value < 0)
throw new Exception("Negative values not allowed");
xCoor = value;
}
}
另一种说法是,C# 属性只是"getXxx()"和"setXxx()"方法的"语法糖",这使您可以避免经常键入"get"和"set"。"自动属性"(get; set;
)只是语法糖,以避免为这些getter和setter方法创建自己的自定义实现。在后台,编译器实际上是在为您创建一个私有字段,就像您在 Java 类上为字段编写 get 和 set 方法时为自己所做的那样。
Java 没有属性。将 Java 的 getter 和 setter 视为 C# 的等价物
酒店的getter和setter。将Java的领域视为相当于C#的
田。C# 允许您在不显式指定
的情况下声明属性的事实该字段,并不意味着该字段在 C# 中不存在。如果我记得不错,在以前的
C# 版本,您必须显式声明字段(因此,如果您有属性
X
你通常会有一个支持字段,比如_x
)。另请注意,在 C# 中它是
使用getX
或setX
等方法并不常见(只是因为您可以执行
通过属性X
的getter和setter相同)。如果你使用这样的方法,它会得到
很明显,您是从Java进入C#的:)