变量,对象和引用之间究竟有什么区别?
例如:它们都指向某种类型,并且它们都必须保存值(当然除非您具有临时的无效类型),但它们的功能和实现究竟如何彼此不同?
例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
Run Code Online (Sandbox Code Playgroud)
它们有相同的概念,但它们有何不同?
Java支持按值传递(总是在副本上工作),但是当你传递一个用户定义的对象时,它会改变实际的对象(通过引用传递但没有指针改变的类型),我理解但是为什么下面的changeObject2CLEAR方法实际上正在改变对象的价值?相反,它必须在副本上工作?
import java.util.HashMap;
import java.util.Map;
public class PassBy {
class CustomBean {
public CustomBean() {
}
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id + ", " + name;
}
}
public Map<Integer, String> changeObject2NULL (Map<Integer, String> m) {
m = null;
return …Run Code Online (Sandbox Code Playgroud) 我读到Java是按值传递的.所以我们假设我们有这个代码,并说它的HashMap somehashMap寿命比foo.所以foo不允许被垃圾收集,即使它已经完成它的工作只是因为我们把foo放在Map中然后忘了从它中删除.现在按照我链接到的帖子中的答案的逻辑我们实际上是将方法的引用副本传递foo给方法put()吗?在这种情况下,foo放入HashMap应该不会阻止它被垃圾收集.你能帮我理解这里发生了什么吗?我到底错过了什么?
public void someMethod(){
Foo foo = new Foo();
somehashMap.put(fooKey,foo);
}
Run Code Online (Sandbox Code Playgroud) 类,它们的方法,它们的变量等对我来说都是一个非常新的概念,也是我难以完全掌握的东西.
我在教自己Ruby,这个话题令人沮丧,所以我决定以不同的方式看待事物.
我意识到我从第一天起就一直在使用类,实例变量和实例方法.
例
**字符串 - 类
"嗨,我的名字是...." - String类的实例.
.length - 我可以在上面的实例上调用的String类的实例方法.
"Hi my name is....".length => 17
Run Code Online (Sandbox Code Playgroud)
我可以创造
x = String.new("Hi")
Run Code Online (Sandbox Code Playgroud)
但我也可以创造
x = "Hi"
Run Code Online (Sandbox Code Playgroud)
两者都是一样的
如果我创建了一个猫类
class Cat
attr_reader :name
def initialize(name)
@name = name
end
end
jinx = Cat.new("Jinx")
print jinx.name => Jinx
Run Code Online (Sandbox Code Playgroud)
我们在这里
猫级
"Jinx" - Cat类的实例.
.name - Cat类的实例方法.
两个问题
这是查看课程的好方法吗?当我遇到更大的问题,比如创建一个有多个课程的tic tac toe游戏(我现在正在做的)时,我觉得有时会感到头疼.这令人沮丧,因为我感到愚蠢(也许我应该习惯),但我在这里打败自己.我有一个非常容易的时间进行代码大战并用单一方法解决大量问题.我知道某个地方,如果我能把它与课程联系起来,我会更好地理解.在坚持自学的最佳方式时,是否正在寻找解决方案代码?我没有人要问,我希望保留尽可能多的信息.
第二,Ruby如何知道String是一个字符串,一个数组是一个数组,一个Hash a Hash所以我可以定义那些变量而不是调用.new就像我对Cat一样?它只是语法""用于字符串,[]用于数组,{}用于哈希所以它假定我们正在谈论的是什么?
假设我们有以下代码片段:
Cat cat = new Cat(); // The Cat class extends Animal
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(cat);
Run Code Online (Sandbox Code Playgroud)
cat是Cat指向类型对象的类型的引用Cat
animalList.get(0)是类型的引用Animal,指向与cat引用相同的对象.
cat == animalList.get(0)将评估,true因为他们都指向同一个对象.
但是,一个引用是类型Cat而另一个是类型Animal(列表中的位置0),所以我错误地说引用不完全相等,即使它们指向相同的内存位置?我是否过多地研究术语?
创建线程时,我看到如下代码:
Runnable watdaheck = new Runnable()
{
System.out.println("java with time contradicts itself");
}
Run Code Online (Sandbox Code Playgroud)
据我所知,无法实例化接口,因此我无法理解我们如何编写Runnable()来创建匿名类。可以给接口一个参考,但是不能实例化多态性。