package com.nwpu.test.TSTest; public class SuperTest05 { public static void main(String[] args) { Vip v = new Vip("张三"); v.doSome(); } } class Customer{ String name; public Customer() { } public Customer(String name) { this.name = name; } public void doSome(){ System.out.println(this.name + "doSome!!!"); System.out.println(name + "doSome!!!"); } } class Vip extends Customer { //假设子类也有一个同名属性 String name; //实例变量 public Vip() { } public Vip(String name) { super(name); } } 解释一下为什么v.doSome会输出“张三doSome!!!”
时间: 2024-04-28 14:19:05 浏览: 104
在这段代码中,首先创建了一个`Vip`类的实例对象`v`,并传入了一个名为“张三”的参数,在`Vip`类的构造方法中通过`super(name)`将该参数传递给父类`Customer`的构造方法,从而完成了父类实例变量`name`的初始化。
在`Vip`类中定义了一个同名实例变量`name`,但是在`Vip`类的构造方法中没有对其进行初始化操作,因此,子类实例变量`name`的值为默认值`null`。
在`Customer`类中,定义了一个`doSome()`方法,其中调用了`this.name`和`name`,分别输出了实例变量`name`的值。由于`Vip`类中没有覆盖`doSome()`方法,因此调用的是`Customer`类中的`doSome()`方法。由于`Vip`类中的同名实例变量`name`没有被初始化,因此在调用`doSome()`方法时输出的实例变量`name`的值为`null`。
综上所述,调用`v.doSome()`方法时,会输出“张三doSome!!!”,其中“张三”来自`Vip`类实例对象的初始化参数,而“doSome!!!”来自`Customer`类中的`doSome()`方法的输出语句。
相关问题
package com.nwpu.test.TSTest; public class SuperTest05 { public static void main(String[] args) { Vip v = new Vip("张三"); v.shopping(); System.out.println("---------------------"); v.doSome(); } } class Customer{ String name; public Customer() { } public Customer(String name) { this.name = name; } public void doSome(){ System.out.println(this.name + "doSome!!!"); //System.out.println(super.name + "doSome!!!");//编译报错 System.out.println(name + "doSome!!!"); } } class Vip extends Customer { //假设子类也有一个同名属性 String name; //实例变量 public Vip() { } public Vip(String name) { super(name); //这个是前面讲了的,如果我们不赋值的话, //系统会自动初始化实例变量的值为对应类型的默认值。 //所以这里还有一句代码: //this.name = null; } public void shopping() { System.out.println(this.name + "正在购物"); System.out.println(super.name + "正在购物"); System.out.println(name + "正在购物"); } }解释一下为什么v.dosom
e()方法中的代码`System.out.println(super.name + "doSome!!!");//编译报错`会编译报错。
在Java中,子类可以继承父类的实例变量和方法,但是如果子类中也定义了同名的实例变量,则会覆盖父类的同名实例变量,因为Java中实例变量是可以被子类继承的。在`Vip`类中,定义了一个同名实例变量`name`,因此在`Vip`类中,`this.name`会指向子类自己的`name`实例变量,而不是父类的`name`实例变量。因此,在`Vip`类的`shopping()`方法中,`this.name`和`name`都指向子类自己的`name`实例变量。而在`Vip`类的`doSome()`方法中,即使使用`super`关键字也无法访问父类的同名实例变量`name`,因为同名实例变量已经被子类覆盖,父类的同名实例变量已经被隐藏了,因此编译报错。
File "E:/learning/NEW/code/yolov8/NWPU/yolov8-pytorch-master/train.py", line 548, in <module> fit_one_epoch(model_train, model, ema, yolo_loss, loss_history, eval_callback, optimizer, epoch, epoch_step, epoch_step_val, gen, gen_val, UnFreeze_Epoch, Cuda, fp16, scaler, save_period, save_dir, local_rank) File "E:\learning\NEW\code\yolov8\NWPU\yolov8-pytorch-master\utils\utils_fit.py", line 34, in fit_one_epoch outputs = model_train(images) File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\parallel\data_parallel.py", line 166, in forward return self.module(*inputs[0], **kwargs[0]) File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "E:\learning\NEW\code\yolov8\NWPU\yolov8-pytorch-master\nets\yolo.py", line 165, in forward self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5)) File "E:\learning\NEW\code\yolov8\NWPU\yolov8-pytorch-master\utils\utils_bbox.py", line 25, in make_anchors sy,sx = torch.meshgrid(sy, sx, indexing='ij') if TORCH_1_10 else torch.meshgrid(sy, sx) File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\functional.py", line 463, in meshgrid return _meshgrid(*tensors, indexing=indexing) File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\functional.py", line 478, in _meshgrid return _VF.meshgrid(tensors, **kwargs,indexing='ij') # type: ignore[attr-defined] TypeError: meshgrid() got multiple values for keyword argument 'indexing'
这个错误是由于你使用了 PyTorch 的多 GPU 训练,但是在使用 meshgrid 函数时,指定了 indexing 参数两次,导致报错。你可以检查一下代码中使用 meshgrid 函数的地方,确保只指定了一次 indexing 参数。如果还有问题,可以提供更多的代码和错误信息,便于更好地定位问题。
阅读全文