1.java final
java 的常对象是可以修改里面的元素的
但是不能赋值给另一个对象
import java.util.*;
public class Main {
public static void main(String []args) {
final List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.set(0,5);
for(var num : list){
System.out.println(num);
}
Collections.sort(list);
for(var num : list){
System.out.println(num);
}
}
}
java 的不能赋值给另一个对象
import java.util.*;
public class Main {
public static void main(String []args) {
final List<Integer> list = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list = list2;
}
}
报错:Main.java:7: error: cannot assign a value to final variable list
list = list2;
^
1 error
2 c++ const
const vector<int>& nums;
nums[1] = 2; //错误
sort(nums.begin(),nums.end());//错误
vector<int> p{3,4,5,4,3};
nums = p; //错误
这样编译器都会报错
C++ 的常对象,即不能被另一个对象赋值,也不能修改里面的元素,排序也不行。
常对象,只能调用 const 的方法
3 C#
using System;
using System.Collections.Generic;
namespace Program.Exp
{
class MainProgram
{
static readonly Dictionary<int,int> dic = new Dictionary<int,int>();
static void Main(string[] args)
{
dic.Add(1,2);
dic.Add(2,3);
foreach(var kv in dic){
Console.WriteLine(kv.Key + " " + kv.Value);
}
dic[2] = 6;
foreach(var kv in dic){
Console.WriteLine(kv.Key + " " + kv.Value);
}
//错误
Dictionary<int,int> dic2 = new Dictionary<int,int>();
dic = dic2;
}
}
}
C# 的 readonly 也是修改成员的,但是也不能被赋值给另一个对象,和java类似
遇到一个老程序,和我一起用Unity3d 搞独立游戏。主要是C#语言。
看见我定义了一堆 readonly 的 Dictionary,表示很惊讶。立马diao 了我一顿,说那都不能修改值了,搞毛啊。
于是我一顿解释说,C#的readonly 是可以修改值的。
我一猜,那老哥一定以前是写C++的,一问果然是的。
这就是标准的思维定势在作祟。所以有时,不能想当然。
因为我一开始学的是java,后来为了刷题和适应y总的课程,才又学的C + +。现在搞得C + +都远比java用的熟练了。
因为我之前知道java 的 final 也是可以改成员的值的。C#和java的这个特性比较像,所以比较容易就适应了。
感觉解决那种思维定势,还是得多拓展一下知识面,然后多练习才行。
深度和广度都要进行,古人说的渊博,渊就是深度,博就是广度。
光有深度,容易转牛角尖。容易陷入一种单一思维中去。
光有广度,那么就是容易看问题浅,太表面。
所以,深度和广度要同时进行。