【cs61b】学习笔记day1

1.1 java基础

Hello World

  • java程序由一个类声明组成,使用关键字public class声明。在Java中,所有代码都位于类中。

  • 运行的代码在一个名为main的方法中,该方法被声明为public static void main(String[] args)。

  • 我们使用大括号{}表示一段代码的开始和结束。语句必须以分号结束

运行java程序

执行Java程序最常见的方法是通过两个.program的序列运行它。第一个是Java编译器,或javac。第二个是Java解释器(Java)。
在这里插入图片描述

变量和循环

  • 所有的变量必须在使用之前声明,并且必须给它一个指定类型,而且这个类型在后面的程序中不可改变,类型在代码运行前就被验证
  • 循环定义包含在花括号内,测试的布尔表达式包含在圆括号内。
  • 我们的print语句只是System.out.print而不是System.out.println。这意味着我们不应该包括换行符(return)。
  • print语句将一个数字添加到空格中。这样可以确保数字不会相互碰撞。
  • 在这些特性中,最重要的一个是 声明一个有指定类型的变量。

静态类型

Java最重要的特性之一是所有变量和表达式都有一个称为静态类型。
Java变量可以包含这种类型的值,而且只能包含这种类型的值。
此外,变量的类型永远不能改变。
Java编译器的关键特性之一是它执行静态类型检查。

静态类型具有以下优点:

  • 编译器确保所有类型都是兼容的,使程序员更容易调试他们的代码。
  • 由于代码保证没有类型错误,编译程序的用户永远不会遇到类型错误。例如,Android应用程序是用Java编写的,并且通常只以.class文件的形式分发,即以编译格式分发。因此,这样的应用程序永远不会因为类型错误而崩溃,因为编译器已经检查过它们了。
  • 每个变量、参数和函数都有声明的类型,使程序员更容易理解和推理代码。
    在Java中,我们可以说System.out.println (5 + " ");
    但是在Python中,我们不能说print(5+“horse”)为什么会这样呢?
    考虑这两个Java语句:
String h = 5 + "horse";
int h = 5 + "horse";

第一个会成功,第二个将给出一个编译器错误。由于Java是强类型的,如果您告诉它h是一个字符串,它可以将元素连接起来并给您一个字符串。但是当h是int型时,它不能把一个数字和一个字符串连接起来然后给你一个数字。
Python不限制类型,也不能假设你想要什么类型。x =5 +“horse”应该是一个数字吗?一个字符串?Python不知道。所以它出错了。

函数定义

在Python等语言中,函数可以在任何地方声明,甚至可以在函数外部声明。
在java中,不能在外面定义一个函数,所有的函数必须是类的一部分,类中的函数成为方法,所以在java中所有的函数都是方法。
函数的所有参数必须有声明的类型,Java中的函数只能返回一个值

好的编程风格的一些最重要的特征是:

  • 一致的风格(空格、变量命名、大括号风格等)
  • 大小(行不要太宽,源文件不要太长)
  • 描述性命名(变量、函数、类),例如变量或函数的名称为year或getUserName,而不是x或f。
  • 避免重复代码:除了一些更改之外,您几乎不应该有两个重要的代码块几乎相同。
  • 在适当的地方注释。Java中的行注释使用//分隔符。块(也就是多行注释)注释使用/* 和 */。
    黄金法则是:编写代码时要让陌生人也能很容易理解。

break & continue

  • continue语句跳过循环当前迭代的其余部分,有效地直接跳转到增量条件。
  • break关键字在调用时完全终止最内层循环。

1.2 定义和使用类

静态 & 非静态方法

静态方法

Java中的所有代码都必须是类的一部分(或类似于类的东西,我们将在后面学习)。大多数代码都是在方法内部编写的。
让我们考虑一个例子:

public class Dog {
    public static void makeNoise() {
        System.out.println("Bark!");
    }
}

如果尝试运行Dog类,我们只会得到一条错误消息:

$ java Dog
Error: Main method not found in class Dog, please define the main method as:
       public static void main(String[] args)

我们定义的Dog类不做任何事情。我们简单地定义了狗狗可以做的事情,即制造噪音。要实际运行这个类,我们要么需要向Dog类添加一个主方法。或者我们可以创建一个单独的DogLauncher类来运行来自Dog类的方法。例如,

public class DogLauncher {
    public static void main(String[] args) {
        Dog.makeNoise();
    }
}

实例变量和对象实例化

一些关键的观察和术语:

  • Java中的对象是任何类的实例。
  • Dog类有自己的变量,也称为实例变量或非静态变量。这些变量必须在类中声明,这与Python或Matlab等语言不同,这些语言可以在运行时添加新变量。
  • 我们在Dog类中创建的方法没有static关键字。我们称这种方法为实例方法或非静态方法。
  • 要调用makeNoise方法,我们必须首先使用new关键字实例化Dog,然后使特定的Dog吠叫。换句话说,我们调用d.makeNoise()代替Dog.makeNoise()
  • 对象实例化后,可以将其赋值给已声明的适当类型的变量,例如d = new Dog();
  • 类的变量和方法也称为类的成员。
  • 使用点表示法访问类的成员。

Java构造函数

构造函数,实例化是参数化的,从而节省了我们手动输入许多实例变量赋值的时间和混乱。

public class DogLauncher {
    public static void main(String[] args) {
        Dog d = new Dog(20);
        d.makeNoise();
    }
}

类方法和实例方法

Java允许定义两种类型的方法:

  • 类方法,也就是静态方法。
  • 实例方法,也就是非静态方法。

实例方法是只能由类的特定实例执行的操作。静态方法是类本身采取的操作。两者在不同的情况下都是有用的。作为静态方法的一个示例,Math类提供了一个sqrt方法。因为它是静态的,我们可以这样调用它:

x = Math.sqrt(100);

如果sqrt是一个实例方法,我们就会得到下面这种的语法。

Math m = new Math();
x = m.sqrt(100);

有时,一个类同时具有实例方法和静态方法是有意义的。例如,假设想要比较两只狗的能力。
一种方法是添加一个静态方法来比较Dogs。

public static Dog maxDog(Dog d1, Dog d2) {
    if (d1.weightInPounds > d2.weightInPounds) {
        return d1;
    }
    return d2;
}
//此方法可以通过以下方式调用:
Dog d = new Dog(15);
Dog d2 = new Dog(100);
Dog.maxDog(d, d2);

另一种方法是添加一个非静态方法来比较Dogs。

public Dog maxDog(Dog d2) {
    if (this.weightInPounds > d2.weightInPounds) {
        return this;
    }
    return d2;
}
//调用方式:
Dog d = new Dog(15);
Dog d2 = new Dog(100);
d.maxDog(d2);

用类名调用的是静态方法,用具体实例变量调用的是非静态方法

//test
public static Dog maxDog(Dog d1, Dog d2) {
    if (weightInPounds > d2.weightInPounds) {
        return this;
    }
    return d2;
}

静态变量

类拥有静态变量有时是有用的。这些静态属性是类本身固有的,而不是实例固有的。
例如,我们可能会记录狗的学名(或双名)是“Canis familiaris”:

public class Dog {
    public int weightInPounds;
    public static String binomen = "Canis familiaris";
    ...
}

静态变量应该使用类的名称来访问,而不是使用特定的实例,例如,你应该使用Dog.binomen, 不是 d.binomen。虽然Java在技术上允许您使用实例名访问静态变量,但这是一种糟糕的风格。

/** 
< 10:yip

< 30:
bark

>=30:
woof
*/

public class DogLoop {
    public static void main(String[] args) {
   		Dog smallDog = new Dog(5);
   		Dog mediumDog = new Dog(25);
   		Dog hugeDog = new Dog(150);
 
   		Dog[] manyDogs = new Dog[4];  
        manyDogs[0] = smallDog;
   		manyDogs[1] = hugeDog;    	   
        manyDogs[2] = new Dog(130);
 
   		int i = 0;
   		while (i < manyDogs.length) {
       		Dog.maxDog(manyDogs[i], mediumDog).makeNoise();
       		i = i + 1;
        }
    }
}
/**输出:
bark!
woof
woof
错误
*/

public static void main(String[] args)

有了到目前为止学到的知识,现在是时候揭开我们一直用于main方法的声明的神秘面纱了。把它分成几个部分,

  • public:到目前为止,我们所有的方法都以这个关键字开头。
  • static:它是一个静态方法,不与任何特定的实例相关联。void:没有返回类型。
  • main:方法的名称。
  • String[] args:这是传递给main方法的参数。
  • 命令行参数由于main是由Java解释器本身而不是另一个Java类调用的,所以提供这些参数是解释器的工作。它们通常引用命令行参数。