Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 行业新闻 >

java教程对java学习常见的几大代码解读

发布日期:2021-03-09 09:35:21点击次数:

分享到:
1、在静态方法中访问非静态的成员变量(例如在main方法中)
  有很多刚刚接触Java程序远都会有一问题,就是在main方法中访问成员变量。Main方法一般都被标示为“静态的”,意思就是我们不需要实例化这个类来调用main方法。例如,java虚拟机能够以这样的形式来调用MyApplication类:
MyApplication.main(命令行参数);
  这里并没有实例化MyApplication类,或者这里没有访问任何的成员变量。例如下面的程序就会产生一个编译器的错误。
public class StaticDemo
{
public String my_member_vaiable = "somedata";
public static void main (String args[])
{
// Access a non-satic member from static method
System.out.println ("This generates a compiler error"+
my_member_variable);
}
}
  如果你要访问一个静态方法中的成员变量(比如main方法),你就需要实例化一个对象。下面这段代码示例了如何正确的访问一个非静态的成员变量。其方法就是首先实例化一个对象。
public class NonStaticDemo
{
public String my_member_variable = "somedata";
public static void main (String args[])
{
NonStaticDemo demo = new NonStaticDemo();
// Access member variable of demo
System.out.println ("This WON'T generate an error"+
demo.my_member_variable);
}
}
2、在重载的时候错误的键入方法名重载允许程序员用新的代码去覆盖方法的实现
  重载是一个便利的特性,很多面对对象的程序员都在大量的使用它。如果你使用AWT1.1的时间处理模型,你通常会覆盖listener方法去实现定制的功能。一个在重载方法的时候很容易犯的错误就是错误的键入要重载的方法名。如果你错误的输入了方法名,你就不是在重载这个方法了。相反的,你是在重新定义一个方法,只不过这个方法的参数和返回类型和你要重载的方法相同罢了。
public class MyWindowListener extends WindowAdapter {
// This should be WindowClosed
public void WindowClose(WindowEvent e) {
// Exit when user closes window
System.exit(0);
}
}
  这个方法不会通过编译,很容易就能捕捉找它。在过去我曾经注意过一个方法,并且相信它是被调用的,花了很多时间去找这个错误。这个错误的表现就是你的方法不会被调用,你以为你的方法已经被跳过了。一种可行的解决方法就是增加一条打印输出语句。在日志文件中记录下信息。或者是使用跟踪调试程序(例如VJ++或者是Borland JBuilder)来一行一行的调试。如果你的方法还不能被调用,那很可能就是你的方法名键入错误了。
3、比较和分配(“=”强于“==”)
  当我们使用==运算符的时候,我们实际上是在比较两个对象的引用,来看看他们是不是指向的同一个对象。举个例子,我们不能使用==运算符来比较两个字符串是否相等。我们应该使用。equals方法来比较两个对象,这个方法是所有类共有的,它继承自java.lang.Object。
下面是比较两个字符串相等的正确的方法:
// Bad way
if( (abc + def) == "abcdef" )
{
……
}
// Good way
if ( (abc + def)。equals("abcdef") )
{
……
}
4、混淆值传递和引用传递
  这是一个不太容易发现的错误。因为,当你看代码的时候,你会十分确定这是一个引用传递,而它实际上却是一个值传递。Java这两者都会使用,所以你要理解你什么时候需要值传递,什么时候需要引用传递。当你要传递一个简单的数据类型到一个函数中,比如,char、int、float或者double,你是在传递一个值。这个意味着这种数据类型的被复制了一个拷贝,是这个拷贝被传递到了函数中。如果这个函数去修改这个值,仅仅是这个值的拷贝被修改了。这个函数结束以后,将会返回到控制调用函数去,这时候那个“真正的”值没有收到影响,没有任何改变被存储。
如果你想修改一个简单的数据类型,可以将这个数据类型定位一个返回值或者将它封装到一个对象中。
  当你要传递一个java对象到一个函数中,比如,数组、向量或者是一个字符串,此时你传递的就是一个对象的引用。这里的字符串也是一个对象,而不是一个简单数据类型。这就意味着你要传递一个对象到一个函数,你就要传递这个对象的引用,而不能去复制它。任何对这个对象的成员变量的改变都会持久化,这种改变的好坏要取决于你是否是刻意而为之。

有一点要注意,如果字符串没有包含任何方法改变它的值的时候,你最好将它作为值来传递。

5、写一个空的异常处理

  我知道一个空的异常处理就像忽略错误一样很诱人。但是如果真的发生了错误,你不会得到一个错误信息的输出,它使得不太可能发现错误的原因。甚至是最简单的一场处理都是很有用处的。举个例子,在你的代码加上try{}catch{},去试着捕捉任何的一场抛出,并打印出错误信息。你不用为每个异常都写出定制的处理(虽然这是一个很好的编程习惯)。但是不要将这个异常处理空着,否则你就不会知道有什么错误发生了。

举例:

public static void main(String args[])

{

try{

// Your code goes here

}

catch (Exception e)

{

System.out.println ("Err - " + e );

}

}

6、忘记java中索引是从0开始的

  如果你有C/C++的编程背景的话,你在使用其他编程语言的时候就不会发现同样的问题了。

  在java中数组的索引是从0开始的,这就是说第一个元素的索引必须是0.困惑了?让我们看看例子吧

// Create an array of three strings

String[] strArray = new String[3];

// First element's index is actually 0

strArray[0] = "First string";

// Second element's index is actually 1

strArray[1] = "Second string";

// Final element's index is actually 2

strArray[2] = "Third and final string";

  在这个例子中,我们定义了一个有着三个字符串的数组,当我们访问他的元素时候减去了一个。现在,当我们试着去访问strArray[3],也就是第四个元素的时候,就会有一个ArrayOutOfBoundsException异常被抛出。这个就是最明显的例子-忘记了0索引规则。

  在其他地方0索引规则也能使你陷入麻烦。例如字符串中。假设你要从一个字符串确定的偏移位置处得到一个字符,使用String。charAt(int)函数,你就能看到这个信息。但是在java学习中,字符串类的索引也是从0开始的,这就是说第一个字符的偏移为之为0,第二个为1.你可能会陷入一些麻烦,如果你不注意这个问题的话,特别是你的应用程序中使用了大量的字符串处理程序,那样的话你就很可能使用错误的字符,同时在运行时抛出一个StringIndexOutOfBoundsException异常,就像ArrayOutOfBoundsException异常一样。下面的例子证明了这些:
 

java对象

public class StrDemo

{

public static void main (String args[])

{

String abc = "abc";

System.out.println ("Char at offset 0 ; " = abc.charAt (0) );

System.out.println ("Char at offset 1 ; " = abc.charAt (1) );

System.out.println ("Char at offset 2 ; " = abc.charAt (2) );

// This line should throw a StringIndexOutOfBoundsException

System.out.println ("Char at offset 3 ; " = abc.charAt (3) );

}

}

  同时应该注意的是,0索引规则不应该只应用在数组或是字符串中,java的其他部分也会用到。但是并不是全部都会用到。Java.util.Date和java.util.Calendar,这两个类的月份都是从0开始的,但是日期却通常是从1开始的,下面的程序证明了这一点。

import java.util.Date;

import java.java.util.Calendar;

public class ZeroIndexedDate

{

public static void main (String args[])

{

// Get today's date

Date today = new Date();

// Print return value of getMonth

System.out.println ("Date.getMonth() returns ; " +

today.getMonth());

// Get today's date using a Calendar

Calendar rightNow = Calendar.getInstance();

// print return value of get ( Calendar.MONTH )

System.out.println ("Calendar.get (month) returns ; " +

rightNow.get (Calendar.MONTH));

}

}