梅庄

java语言程序设计(基础篇+进阶篇)读书笔记2

Ch8 多维数组

1
int[][] x = new int[3][4];
  • Suppose int[][] m = { {4, 5, 6}, {2, 1, 0} }, what is m.length?
    答案:2
  • Suppose int[][] m = { {4, 5, 6}, {2, 1, 0} }, what is m[0].length?
    答案:3

这里吐槽一下,hexo 编译markdown时候,不能连续写两个 {或者},中间必须加空格,不然会编译出错 。

计算二维数组各项之和

1
2
3
4
5
6
7
public static int m(int[][] m) {
int result = 0;
for (int i = 0; i < m.length; i++)
for (int j = 0; j < m[i].length; j++)
result += m[i][j];
return result;
}

Ch9 对象和类

源代码中的每个类都会被编译成.class文件

构造方法

构造方法在使用new操作符穿件对象的时候被调用

  • 构造方法必须具备和所在类相同的名字
  • 构造方法没有返回值类型,甚至连void也没有
  • 构造方法是在创建一个对象使用new操作符时调用的
    1
    Circle myCircle = new Circle();

变量myCircle中放的是对Circle对象的一个引用。

基本类型变量和引用类型变量

对基本类型变量来说没对应内存所存储的值是基本类型值。对引用类型变量来说,对应内存所存储的值是一个引用,是对象的存储地址。

Random类

创建一个Random对象时,必须指定一个种子或者使用默认的种子。种子是一个用于初始化一个随机数字生成器的数字。无参构造方法使用当前已经逝去的时间作为种子,创建一个Random对象。如果这两个Random对象有相同的种子,那它们将产生相同的数列。
例如:

1
2
3
4
5
6
7
8
Random randoml = new Random(3);
System.out.print("From random1:");
for (int i = 0; i < 10; i++)
System.out.print(randoml.nextlnt(1000) + " " );
Random randofn2 = new Random(3);
System.out.print(,"\nFrom random2: " );
for (int i = 0; i < 10; i++)
System.out.print(random2.nextlnt(1000) + " ");

这些代码产生相同的int类型的随机数列:
From random1:734 660 210 581 128 202 549 564 459 961
From random2:734 660 210 S81 128 202 549 564 459 961

静态变量

静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会收到影响。Java支持静态方法和静态变量,无需创建类的实例就可以调用静态方法(static method)

类中的常量是被该类的所有对象所共享的,因此,常量应该声明为final static

实例方法和实例数据都是属于实例的,所以它们在实例创建之后才能使用。它们是通过引用变量来访问的。静态方法和静态数据可以通过引用变量或它们的类名来调用。

静态变量和方法可以在不创建对象的情况下访问。

静态成员和实例成员的关系
提示

使用类名.方法名(参数)的方式调用静态方法,使用类名.静态变量的方式访问静态变量,可以提高可读性。

设计指南

如果一个变量或方法依赖于类的某个具体实例,那就应该将它定义为实例变量或实例方法。如果一个变量或方法不依赖于类的某个具体实例,那就应该将它定义为静态变量或静态方法(比如判读素数?计算阶乘?等等)。

可见性修饰符

  • private只能应用在类的成员上
  • public可以应用在类或类的成员上
  • 局部变量上使用修饰符public和private都会导致编译错误
注意

大多数情况下, 构造方法应该是公共的。但是,如果想防止用户创建类的实例,就用过使用私有构造方法。
比如,因为Math类的所有数据域和方法都是静态的,所以没必要创建Math类的实例。为防止用户从Math类创建对象,在java.lang.Math中的构造方法定义如下:

1
2
private Math(){
}

向方法传递参数

Java只有一种参数传递方式:值传递(pass-by-value)

times 的内容改变,这并不会影响n的内容
而通过在printAreas方法内部的c与在方法外的myCircle来改变对象的属性,效果是一样的。引用上的传值在语义上最好描述为传共享(pass-by-sharing),也就是说,在方法中引用的对象和传递的对象是一样的。

对象数组

数组既可以存储基本类型值,也可以存储对象

1
Circle[] circleArray = new Circle[10];

当使用new 操作符创建对象数组后,这个数组中的没给我元素都是默认值为null的引用变量。

变量的作用域
1
2
3
4
5
6
7
8
9
10
public class F {
private int x = 0; // Instance variable
private int y = 0;
public F() { }
public void p() {
int x - 1; // Local variable
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}

调用f.p()
x:1

  • x被声明为类中初值为0的数据域,但是它在方法p()中又被声明了一次,初值为1,打印的是后者

y:0

  • y在方法p()的外部声明,但在方法内部也是可访问的。

this引用

关键字this引用对象自身。它也可以在构造方法内部用于调用同一个类的其他构造方法。

1
2
3
4
5
6
7
8
9
10
public class Circle {
private double radius;
public Circle(double radius) {
this.radius - radius;//this关键字用于引用所构建的对象的隐 藏数据域radius
}
public Clrcle() {
thls(l.O);//this关键字用于调用另外一个构造方法
}
}

  • Java要求在构造方法中,语句this(参数列表)应在任何其他可执行语句之前出现。
  • 如果一个类有多个构造方法,最好尽可能使用this(参数列表)实现它们。通常,无参数或参数少的构造方法可以用this(参数列表)调用参数多的构造方法。这样做通常可以简化代码,使类易于阅读和维护。

本章小结

  1. 类是对象的模板。它定义对象的属性,并提供用于以创建对象的构造方法以及操作对象的普通方法。
  2. 类也是一种数据类型。可以用它声明对象引用变量。对象引用变童中似乎存放了一个对象,但事实 上,它包含的只是对该对象的引用。严格地讲,对象引用变量和对象是不同的,但是大多数情况下, 它们的区别是可以忽略的。
  3. 对象是类的实例。可以使用new 操作符创建对象,使用点搡作符( .)通过对象的引用变量来访问该 对象的成员。
  4. 实例变量或方法属于类的一个实例。它的使用与各自的实例相关联。静态变量是被同一个类的所有 实例所共享的。可以在不使用实例的情况下调用静态方法。
  5. 类的每个实例都能访问这个类的静态变量和静态方法。然而,为淸晰起见,最好使用 “类名.变量” 和 “类名.方法” 来调用静态变量和静态方法。 6. 可见性修饰符指定类、方法和数据是如何被访问的。公共的(public)类、方法或数据可以被任何 客户访问,私有的(private)方法或数据只能在本类中被访问。
  6. 可以提供 get (访问器)方法或者 set (修改器)方法使客户程序能够看到或修改数据。
  7. get 方法具有方法签名 public returnType getPropertyNameO。如果返回值类型( returnType)是 boolean 型,则 get 方法应该定义为 public boolean isPropertyNameO。set 方法具有方法签名 public void setPropertyName(dataType propertyValue), ,
  8. 所有传递给方法的参数都是值传递的。对于基本类型的参数,传递的是实际值;而若参数是引用教据类型,则传递的是对象的引用。
  9. Java数组是一个可以包含基本类型值或对象类型值的对象。当创建一个对象数组时,它的元素被 賦予畎认值 null。
  10. 一旦被创建,不可变对象(immutableobject) 就不能被改变了。为了防止用户修改一个对象,可以 定义该对象为不可变类。
  11. 实例变童和静态变量的作用域是整个类,无论该变量在什么位置定义。实例变量和静态变量可以在 类中的任何位置定义。为一致性考虑,本书都在类的开始部分定义。
  12. this关键宇可以用于引用进行调用的对象。它也可以用于在构造方法中来调用同一个类的另外一 个构造方法。