在课堂上,我有:
private Foo bar;
public Constructor(Foo bar)
{
this.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)
而不是从参数中提供的对象创建bar的副本,是否可以在构造函数中包含指向bar的指针,以便更改原始栏会更改此对象中的字段?
另一种方式:
int x = 7;
int y = x;
x = 9;
System.out.print(y); //Prints 7.
Run Code Online (Sandbox Code Playgroud)
可以将其设置为打印y打印9而不是7?
我在Android上有以下Kotlin类:
class ThisApplication: Application() {
lateinit var network: INetwork
override fun onCreate() {
super.onCreate()
network = Network()
}
}
Run Code Online (Sandbox Code Playgroud)
现在,任何外部类都可以通过简单地执行以下操作来获取INetwork参考:
application.network
Run Code Online (Sandbox Code Playgroud)
但是,这也使外部类可以覆盖该值:
application.network = myNewNetworkReference
Run Code Online (Sandbox Code Playgroud)
我想避免第二种选择.不幸的是,我无法创建该字段,val因为它的初始化需要在onCreate回调中发生.
我还考虑过将字段设为私有并通过函数公开它,如下所示:
private lateinit var network: INetwork
fun getNetwork() = network
Run Code Online (Sandbox Code Playgroud)
但是,无论谁调用getNetwork()仍然可以为其分配一个新值,如下所示:
application.getNetwork() = myNewNetworkReference
Run Code Online (Sandbox Code Playgroud)
如何使网络字段成为外部类的只读?或者甚至更好,val即使我无法在构造函数中初始化它,有没有办法实现它?
我想调用一个可能采用不同版本的方法,即类型为输入参数的相同方法:
我想这样做的方法是"重载"方法(我认为这是正确的术语?):
public void getValue(byte theByte) {...}
public void getValue(short theShort) {...}
... etc ...
Run Code Online (Sandbox Code Playgroud)
...但这意味着我必须通过引用传递原始类型...类似于C++,其中方法具有外部效果,其中它可以修改其范围之外的变量.
有没有办法在不创建新类或使用原始类型的Object版本的情况下执行此操作?如果没有,有关替代战略的任何建议吗?
让我知道是否应该进一步解释清除任何混淆.
我实际上要做的是从一组位构造基本类型.因此,如果我正在处理方法的字节版本,我希望我的工作能够得到8位并返回字节(因为我无法通过引用传递).
我问这个问题的原因是因为我用bit做的工作是非常重复的,我不想在不同的方法中使用相同的代码.所以我想找到一种方法让我的ONE方法知道我正在谈论多少位......如果我正在处理一个字节,那么就是8位,如果我正在处理一个短的16位等等...
根据:http:
//java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
4.5.2引用类型
的变量引用类型可以包含null引用.
当指定的值是null?时,是否可以检索引用类型的声明类型?
具体来说,在使用反射的方法中,我希望该方法是null安全的并且对原始声明的类型起作用(虽然我知道以下代码片段不起作用),例如:
String referenceType = null;
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
Class<?> declaredType = referenceType.getClass();
}
Run Code Online (Sandbox Code Playgroud)
如果需要,我不会反对使用泛型来获取类型T而不是Object声明的参数类型.
编辑:我知道它.getClass()适用于实例,而不是声明的类型.我想知道是否可以询问引用它的声明类型.由于类层次结构是静态的,因此获取该信息应该没有问题.
编辑2:在这里,情况很清楚:Java是"通过引用传递"还是"按值传递"?
Java只是按值传递,因此即使使用了引用类型,也总是处理它,就好像传递了值(对象实例)一样(即使内部只传递了一个对象指针).这意味着Java实际上并没有一个知道它的类型的引用类型(至少就程序员而言),它都在值实例中.
因此,无法确定任何null值的类型.
我有以下代码,它有
一个可变的Person类,String和一个修改String和Person实例的方法
class Person{
int a = 8;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
@Override
public String toString() {
return "Person [a=" + a + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
-
public class TestMutable {
public static void main(String[] args)
{
Person p = new Person();
p.setA(34);
String s = "bar";
modifyObject(s, p); //Call to modify objects
System.out.println(s);
System.out.println(p);
}
private static void modifyObject(String str, Person p)
{
str = "foo";
p.setA(45); …Run Code Online (Sandbox Code Playgroud) java terminology parameter-passing pass-by-reference pass-by-value
我在我的代码中发现了一个问题.首先是代码:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
String[] blablubb = { "a", "b", "c" };
for(String s : blablubb) {
s = "over";
}
printArray(blablubb);
for (int i = 0; i < blablubb.length; i++) {
blablubb[i] = "over";
}
printArray(blablubb);
}
public static void printArray(String[] arr) {
for( String s : arr ) {
System.out.println(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
a
b
c
over
over
over
Run Code Online (Sandbox Code Playgroud)
我假设第一个循环也会覆盖数组中的String.所以输出在任何情况下都会结束.它似乎创建了值的副本而不是创建引用.我从未察觉过这一点.我做错了吗?是否有选项来创建引用?
//编辑:除了我之外,似乎每个人都知道这一点.我来自C背景,并没有足够重视与C非常不同的术语参考.幸运的是,我花了10分钟来计算出来(这一次).
假设我的代码是这样的:
ArrayList list = new ArrayList();
Student s = new Student(); // creating object of Student class
myList.add(s); // Here am confused ...
/* myList contains just the reference variable to the Student object, OR
myList contains the actual Student object (memory allocation for name, rollNo etc) ??
*/
Run Code Online (Sandbox Code Playgroud)
在使用add()向ArrayList添加对象时:
ArrayList是"对象引用"列表或"实际对象"列表???
我已经做了以下示例来检查我的知识
import java.util.Map;
public class HashMap {
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
valueMap.put("lastName", "yyyy");
return valueMap;
}
public static void main(String[] args) {
Map<String, String> inputMap = new java.util.HashMap<String, String>();
inputMap.put("firstName", "xxxx");
inputMap.put("initial", "S");
System.out.println("inputMap : 1 " + inputMap);
System.out.println("changeMe : " + useDifferentMap(inputMap));
System.out.println("inputMap : 2 " + inputMap);
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
original Map : 1 {initial=S, firstName=xxxx}
useDifferentMap : {lastName=yyyy, initial=S, firstName=xxxx}
original Map : 2 {lastName=yyyy, initial=S, firstName=xxxx}
Run Code Online (Sandbox Code Playgroud)
此方法useDifferentMap获取地图并更改值并返回相同的值.修改后的地图将包含修改后的值,其范围为useDifferentMap方法的本地范围. …
所以这是另一个有价值的downvote问题.
我知道Java IS是按价值传递的,这意味着什么以及它是如何工作的.所以这不是另一个你可以解释什么是价值传递.我更为好奇的是,为什么Java不包括通过引用传递?我想这会有用吗?知道如何巩固我头脑中的推理也是有帮助的....
我讨厌'这是因为'场景肯定相当于'因为我这么说'.那么有没有人能够回答为什么Java只包含值传递?