第三周

一、使用JDB调试java代码(主要内容为断点)

以下文字内容转自使用JDB调试java程序,图片则为自己的截图

20175215 2018-2019-2 第三周java课程学习总结-LMLPHP

如上图,我们在Linux Bash 中输入vim HelloJDB.java编辑调试示例代码

1 public class HelloJDB {
2 public static void main(String[] args) {
3 int i = 5;
4 int j = 6;
5 int sum = add(i, j);
6 System.out.println(sum);
7
8 sum = 0;
9 for(i=0; i< 100; i++)
10 sum += i;
11
12 System.out.println(sum);
13 }
14
15 public static int add(int augend, int addend){
16 int sum = augend + addend;
17 return sum;
18 }
19}

其它关于帮助或者启动的不加赘述,直接开始设置断点,我们通过运行stop in HelloJDB.main命令在main方法开始出设置断点:

20175215 2018-2019-2 第三周java课程学习总结-LMLPHP

同时使用locals命令和step命令进行断点的调试

20175215 2018-2019-2 第三周java课程学习总结-LMLPHP

20175215 2018-2019-2 第三周java课程学习总结-LMLPHP

但是使用use之后list的内容并不能正确的被读取,因此我直接把HelloJDB.java文件放在和HelloJDB.class一个目录下,不然无法读取,这很让我困扰,希望有人能在评论区指出问题。

20175215 2018-2019-2 第三周java课程学习总结-LMLPHP

最后就是设置行断点了,我们可以通过stop at HelloJDB:12在第12行设个断点,然后运行cont就会一下子把循环运行完并停在第十二行。(cont是continue的缩写,功能是运行到下一个断点处停止

二、第四章学习过程问题小结

1.局部变量和成员变量的区分

如果局部变量的名字与成员变量的名字相同,那么成员变量将被隐藏,即该成员变量在这个方法内暂时失效。例如:

class Tom{
int x = 10,y;
void f(){
int x = 5;
y = x+x; //y得到的值是10,不是20.如果方法f中没有“int x=5;”,y的值将是20.
}
}

如果方法中的局部变量的名字与成员变量的名字相同,那么方法就隐藏了成员变量,如果想在该方法中使用被隐藏的成员变量,必须使用关键字this,例如

class Tom{
int x =10,y;
void f(){
int x = 5;
y = x+this.x;//y得到的值是15。
}
}

2.关于new运算符的简单总结

--书中总结

3.可变参数的用法注意

public void g(double a,int ... x)的方法g的参数列表中,第一个参数是double型,第2个至最后一个参数是int型,连续出现的int型参数的个数不确定(可变)。称x是方法g的参数列表中的可变参数的“参数代表”。“参数代表”必须是参数列表中的最后一个。特别注意的是,下列方法定义中

public void method(int ... x,int y)

错误地使用了可变参数x,因为可变参数x代表的最后一个参数不是method方法的最后一个参数,method方法的最后一个参数y不是可变参数x所代表的参数之一。

另外,对于可变参数,Java也提供了增强的for语句,允许按如下方式使用for语句遍历参数代表所代表的参数

for(声明循环变量:参数代表){
...
}

4.实例方法和类方法的区别

(1)对象调用实例方法

-当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才会分配入口地址,从而实例方法可以被类创建的任何对象执行。

-实例方法中不仅可以操作实例变量,也可以操作类变量,当对象调用实例方法时,该方法中出现的实例变量就是分配给该对象的实例变量,该方法中出现的类变量也是分配给该对象的变量,只不过这个变量和所有的其他对象共享而已。

(2)类名调用类方法

-对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址,从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。注意:实例方法不能通过类名调用,只能由对象来调用

-和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前,实例成员变量还没有分配内存。

(3)设计类方法的原则

-对于static方法,不必创建对象就可以用类名就可以直接调用它(创建对象会导致类中的实例变量被分配内存空间)。如果一个方法不需要操作类中的任何实例变量,就可以满足程序需要,考虑将这样的方法设计为一个static方法。

5.避免重载出现歧义

重载方法之间必须保证相互的参数不同,但需要小心的是,重载方法在被调用时可能出现歧义调用。例如下列Dog类中的冲荣耀方法就是容易引起歧义的重载方法(Dog类中没有语法错误):

class Dog{
static void cry(double m, int n){
System.out.println("小狗");
}
static void cry(int m, double n){
System.out.println("small dog");
}
}

对于上述Dog类,代码:

Dog.cry(10.0,10);

输出的信息是:“小狗”;代码:

Dog.cry(10,10.0);

输出的信息时“small dog”;但是,代码:

Dog.cry(10,10);

却无法通过编译(提示信息:对cry的引用不明确),因为Dog.cry(10,10)不清楚应当执行重载方法中的哪一个(出现歧义调用)。

6.import语句

(1)引入类库中的类
  • java.lang包是Java语言的核心类库,它包含了运行Java程序必不可少的系统类,系统自动为程序引入java.lang包中的类(例如System类、Math类等),因此不需要再使用import语句引入该包中的类。
  • 如果使用import语句引入了整个包中的类,那么可能会增加编译时间,但绝对不会程序运行的性能。因为当程序执行时,只是将程序真正使用的类的字节码文件加载到内存。
  • 如果没用import语句引入包中的类,那么也可以直接带着包名使用该类,例如:

    java.util.Date date = new java.util.Date();

三、码云链接

码云链接

05-08 15:50