用Java中的方法使用"this"怎么样?它是可选的还是有需要使用它的情况?
我遇到的唯一情况是在类中调用方法中的方法.但它是可选的.这是一个愚蠢的例子,只是为了表明我的意思:
public class Test {
String s;
private String hey() {
return s;
}
public String getS(){
String sm = this.hey();
// here I could just write hey(); without this
return sm;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于在Java中更改方法中的变量值的问题.
这是我的代码:
public class Test {
public static void funk(int a, int[] b) {
b[0] = b[0] * 2;
a = b[0] + 5;
}
public static void main(String[] args) {
int bird = 10;
int[] tiger = {7};
Test.funk(bird, tiger);
}
}
Run Code Online (Sandbox Code Playgroud)
执行该方法后Test.funk(bird, tiger),bird的值不会更改 - 它保留值10,即使在funk()方法中我们更改了值a = b[0] + 5;
另一方面,数组中元素的值会发生变化,因为我们有语句 b[0] = b[0] * 2;
我不明白为什么一件事改变而另一件事没改变?有人可以帮我解释一下.
我有B类,它继承自A类.超类A是抽象的,包含一个抽象方法.我不想在B类中实现抽象方法,因此我需要将类B声明为抽象.声明B类抽象,有两件事对我有用(程序编译并正确运行):
1.)我没有在B类中声明任何抽象方法,甚至认为该类是抽象的.我认为这是有效的,因为该类继承了类A的抽象方法,这足以使类被声明为抽象:我们不需要在类中直接声明的任何其他抽象方法.
2.)我在类B中声明了与在类A中声明的相同的抽象方法.这是某种覆盖(?),与java中的覆盖不同(使用相同的头,但提供不同的实现) ),这里我只是再次使用该方法的相同标题.
这两件事都有效,我不确定它们是否都好,以及其中一些是否优先(更正确).两种方式是否相同(它们对Java是否相同)?
这里我给出一些示例类,所以我的意思对你来说更清楚:
情况1.):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
}
Run Code Online (Sandbox Code Playgroud)
案例2):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
public abstract String giveSum();
}
Run Code Online (Sandbox Code Playgroud)
问候
我正在尝试执行我的第一个"Hello World!" 在C++中.我使用的是Windows XP,我安装了cygwin,其中安装了g ++ C++编译器.我写了一个小的hello-world程序,并将其保存在hello.cpp中.从命令提示符我写:
g ++ hello.cpp
但我得到:
'g ++'不被识别为内部或外部命令,可操作程序或批处理文件.
我在我的D:\ programs\cygwin中安装了cygwin.我在D:\ cpp中使用我的hello-world文件创建了另一个目录.我的安装或路径的东西似乎不好,但我无法弄清楚是什么.我运行了cygwin的exe文件,在安装目录中我有所有必需的文件,我认为:bin文件夹,lib,Cygwin.bat等.
我已经读过,如果出现此类错误消息,我应该检查cygwin1.dll文件是否已复制到Windows的主文件夹中.这是C:\ WINDOWS目录吗?我看过那里,我那里没有这样的文件.我在cygwin的bin文件夹中有cygwin1.dll:D:\ programs\cygwin\bin.另外,如何在命令的搜索路径中检查bin文件夹(D:\ programs\cygwin\bin)?
我认为hello-world程序不应该包含任何语法错误,我刚刚复制了它.还有,当我写的时候
g ++ -v
我收到相同的错误消息:该命令无法识别.如果有人给我一个暗示我应该看什么,我将不胜感激.谢谢.
这是hello-world程序的代码:
#include <iostream>
using namespace std;
int main() {
cout <<"Hello World!"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经安装了g ++,现在当我输入g ++ -v时,我得到:读取规格:\ d\cygnus\cygwin-b20\H-i586-cygwin32\bin ..\lib\gcc-lib\i586-cygwin32\egcs-2.91.57\specs gcc version egcs-2.91.57 19980901(egcs-1.1 release)
在bin目录中,我有g ++.exe和gcc.exe.我不明白为什么我得到"gcc"而不是"g ++".我不知道这有多重要,但是当我尝试在DOS命令提示符下编译程序时收到错误消息:
我明白了:
hello.cpp:1: parse error before character 0357
hello.cpp: In function 'int main()':
hello.cpp:'cout' undeclared (first use this function)
hello.cpp: (Each undeclared identifier is reported …Run Code Online (Sandbox Code Playgroud) 我在理解链表数据结构中第一个节点或所谓的头部的性质时遇到了问题.链表由节点组成,每个节点包含一些数据和指向列表中另一个节点的链接.但是第一个节点是包含数据的节点还是到第二个节点的链接?或者它只包含一个节点的链接(没有数据)?我认为链表中的第一个节点既有数据又有到另一个节点的链接,但在一本介绍性书中,解释说head是一个节点,但是一个链接可以带你到第一个节点.同时head是节点类型的变量.为什么会这样?(我在Java工作,如果这很重要).谢谢.
如果我写下面的课程:
public class Example {
int j;
int k;
public Example(int j, int k) {
j = j;
k = k;
}
public static void main(String[] args) {
Example exm = new Example(1,2);
System.out.println(exm.j);
System.out.println(exm.k);
}
}
Run Code Online (Sandbox Code Playgroud)
程序编译,但是当我运行程序时,main方法将打印出两个0.我知道为了说我想在构造函数中初始化实例变量,我必须写:
this.j = j;
this.k = k;
Run Code Online (Sandbox Code Playgroud)
但是如果我不写它,那么在构造函数中(在表达式的左侧和写入侧)评估(或考虑)哪个变量?是参数还是实例变量?这有什么不同吗?
是否存在使用this强制性的其他情况?
在有效的XML中,是否可以生成与其父级同名的子级?例如:
<parent>
<child>
</child>
<parent>
</parent>
</parent>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一个关于Java继承和转换的问题.我有以下两个示例类和一个测试类,我在类之后陈述我的问题:
public class Automobile {
public int var;
public Automobile () {
var = 1;
}
public String toString () {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche () {
var = 2;
}
public String toString () {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println …Run Code Online (Sandbox Code Playgroud) 我有一个关于Java中catch块中语句执行顺序的问题.当我运行下面的类Test1(见下文)时,我希望首先输出Hi !,然后是e.printStackTrace()的结果; 声明,然后再见!但是,我从来没有得到这个订单.请查看我在下面粘贴的输出.
public class Test1 {
public static void calculate() {
try {
int h = 5/0;
} catch (ArithmeticException e) {
System.out.println("Hi!");
e.printStackTrace();
}
System.out.println("Bye!");
}
public static void main(String[] args) {
calculate();
}
}
Run Code Online (Sandbox Code Playgroud)
输出1:
Hi!
Bye!
java.lang.ArithmeticException: / by zero
at Test1.calculate(Test1.java:6)
at Test1.main(Test1.java:15)
输出2:
java.lang.ArithmeticException: / by zero
at Test1.calculate(Test1.java:6)
at Test1.main(Test1.java:15)
Hi!
Bye!
我有两个问题:
1.)更重要的问题:为什么我总是嗨!再见!即使代码中的mye.printStackTrace()在它们之间,也总是一个接一个地打印出来?
2.)为什么有时我会在Hi!之前输出声明e.printStackTrace(),有时候在Bye之后!?我已经多次运行该程序,我无法理解在什么情况下我得到一个或另一个打印.
谢谢.
我使用的是Java 6和Eclipse(Ganymed).
我有一个关于在Java中抛出异常的问题,这似乎是我自己的一种误解,我想为自己澄清一下.
我一直在阅读处理异常代码的两种基本方法是:
1.)在一个带有"throw new ..."的try-block中抛出异常,然后立即在catch-block中捕获它 - 即所谓的try-throw-catch机制.
2.)在一个带有"throw new ..."的方法中抛出一个异常,然后在方法的标题中声明这个方法可能会抛出一个带有"throws ..."的异常 - 即所谓的pass-the-buck.
我最近读到过"抛出一个异常然后用相同的方法捕获它没有任何意义",这让我想到我是否以错误的方式理解了这个东西,或者写了这个东西的人有什么东西别的想法.处理异常的第一种方法不是这样(try-throw-catch机制)吗?我的意思是,它抛出异常并以相同的方法捕获它.我已经读过,在一个方法中抛出异常并在另一个方法中捕获它是一种更好的做法,但这只是一种(可能更好)的方法.另一种方式也是合法和正确的,不是吗?
请你对此发表评论吗?非常感谢你.
java ×8
inheritance ×2
this ×2
c++ ×1
casting ×1
catch-block ×1
cygwin ×1
g++ ×1
head ×1
linked-list ×1
methods ×1
scope ×1
throw ×1
xml ×1