今天在我阅读有关BigDecimal类的一些文档时,我偶然发现了一个基本属性,BigDecimal类是不可变的.
我怎么能向祖母解释不变性概念?
班级不变性的利弊是什么?
扩展类可以变得可变吗?
考虑到我想用我的类扩展BigDecimal:
`MyBigDecimal extends BigDecimal`
Run Code Online (Sandbox Code Playgroud)
扩展是否违反了面向对象的基本设计原则?
根据Oracle的定义,
有时,您希望拥有所有对象共有的变量.这是通过静态修改器完成的.在声明中具有static修饰符的字段称为静态字段或类变量.它们与类相关联,而不是与任何对象相关联.该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置.
通过这个定义,可以安全地推断出一个静态变量属于该类,并且不应该被类的任何对象访问以进行修改.因为所有对象都共享它.
所以来自同一定义的这一行有点令人困惑:
任何对象都可以改变类变量的值......
所以我尝试了这个代码并打印出45(尽管我收到警告说"通过实例引用访问静态成员"):
public class Main {
static int value = 8;
public static void main(String[] args) {
// write your code here
Main main = new Main();
main.value = 45;
System.out.println(value);
}
}
Run Code Online (Sandbox Code Playgroud)
如果这是一个Student类,并且我有一个静态变量numberOfStudents,为什么要允许该类的一个对象更改此类变量的值?
我写了一个测试代码来检查相等性.我检查过Java doc,它说BigInteger是不可变的.检查静态工厂方法的文档,valueOf它看起来像返回已经缓存的不可变实例.那么为什么==在缓存的实例时返回false.
以下是适用valueOf于的Java文档BigInteger:
返回一个Big Integer,其值等于指定long的值.这种"静态工厂方法"优先于(长)构造函数提供,因为它允许重用常用的BigIntegers.
下面的代码将进入无限循环.
public static void main(String[] args) {
while(true) {
BigInteger a = BigInteger.valueOf(100);
BigInteger c = BigInteger.valueOf(100);
if (a == c) {
break;
}
}
Run Code Online (Sandbox Code Playgroud) 问题说明了一切。我有一个指向的File对象/home/user/filename1。
如果我调用file.getAbsolutePath(),它将返回 /home/user/filename1
我的问题是-
谢谢
我知道字符串是不可变的,但为什么呢?
哪个概念使字符串类不可变?
public class Mainclass
{
public static void main(String[] args)
{
String s = "Example";
s.toUpperCase();
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Example
Run Code Online (Sandbox Code Playgroud) 我们能够add/ remove元素List使用add()/ remove()方法而不创建看起来类似的另一个列表StringBuffer append().所以我认为List是可变的.谁能证实我的理解是正确的?如果有错,请用下面的代码说明
List<String> strList = new ArrayList<String>();
strList.add("abc");
strList.add("xyz");
Run Code Online (Sandbox Code Playgroud) 因为String是不可变的我们如何更改String for Example
String s1="Hello";
String s2="Manas";
Run Code Online (Sandbox Code Playgroud)
现在我正在制作
s1=s1+s3;
Run Code Online (Sandbox Code Playgroud)
它将打印"Hello Manas".所以String s1会改变.
那你怎么能说String是不可变的呢?