CS61b学习-part1

eve2333 发布于 2024-11-07 112 次阅读


本人选择了2018spring的课程,因为他免费提供了评分机器,后来得知2021也开放了,决定把其中的Lab尝试一番,听说gitlab就近好评,相当有实力,并借此学习Java的基本知识,请根据pku的cswiki做好评分机器准备,请自行下载IJ IDEA,可以选择破解专业版,感谢伯克利大学和Josh Hug开源如此优质知识

根据前人所说,此课程需要200h,我第一个同学花费了约30到40天暑假时间学完了,估算大概一天5-7h的专精学习时间,现在我在学校,希望from9.18大概50day可以完成😭😭😭😭😭失败了11.7也没看完,都怨那个sb的人工智能相关内容

第一二parts简述了学期任务,评估目标与要求,测评方法等等。看看就好.

Java的基础知识

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("hello world");
    }
}
public class HelloWorld{
    public static void main(String[] args){
        int x=0;
        while(x<10){
            System.put.println(x);
            x=x+1;
        }
        x="horse";
    }
}

1. Before Java variables can be used, they must be declared.
2. Java variables must have a specific type.
3. Java variable types can never change.
4. Types are verified before the code even runs!!!

public class LargerDemo{
/** Returns the Larger of x and y.*/
    public static int larger(int x, int y) {
        if (x > y) {
            return x;
        }
        return y;
    }
    public static void main(String[] args){
        System.out.println(larger(-5, 10));
    }
}
/*
1. Functions must be declared as part of a class in Java. A function that is part of a cLass is calLed a "method". So in Java, all functions are methods.
2. To define a function in Java, we use "public static". We will see alternate ways of defining functions Later. 
3. ALL parameters of a function must have a decLared type,
and the return value of the function must have a decLared type. Functions in Java return onLy one value!
*/

why在jdk23中要求编译以上文件 C:\Users\eve\IdeaProjects\newprojects\src\Main.java
java: 类 LargerDemo 是公共的, 应在名为 LargerDemo.java 的文件中声明,OK我知道了,只要把文件名修改一下即可 ​

lab1和homework0都很简单。是对Java的简单应用。可能cmd部分很有用,不过你应该在linux部分进行了详细学习,git你也是学习使用过了

发现joshhug.gitbooks.io/hug61b是课程教案一样的东西.

Creating and Defining Classes

我们只在cmd输入ls进入到HelloWorld.java文件中,javac HelloWorld.java即可编译运行,但是得到了class文件,这时我们Java HelloWorld就可以解释运行成功,输出helloworld

public class Dog{
    public static void makeNoise(){
        System.out.println("Bark!");
       }
}
public class DogLauncher{
    public static void main(String[] args){
         Dog. makeNoise();
    }    
}

我们实从类中例一个对象

public class Dog{
    public int weightInPounds;

    public /*static*/ void makeNoise(){     
        if (weightInPounds <10){
             System.out. println("yip!");
        } else if (weightInPounds < 30){ 
            System.out. println("bark.");
        } else{
            System.out. println("woooof!");
        }
    } 
} 

运行后我们按照编译器信息删除static,然后创建一个d的dog.重复,执行

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

构造函数:

public Dog(int w){
    wewightInPounds=w;
}

这样可以Dog d=new Dog(51);d.makeNoise();成功运行

现在阐述为什么去掉static,因为使用了其中的实例变量,与static冲突,这使编译器感到困惑 ​

 缺少对下面此图片部分笔记

 你可以拥有一个静态和非静态的类,把他们混合

public class Dog{
public int weightInPounds;
public static String binomen="Canis familiaris"
/*创建一个适用于所有狗的变量,可以在对象d,d2或者Dog使用*/

public Dog(int w){
    weightInPounds=w;
}
public void makeNoise(){
    if (weightInPounds 10){ 
        System.out. println("yip!"); 
    }else if (weightInPounds 30){ 
        System.out. println("bark."); 
    }else{
        System.out. println("woooof! "); 
    }
}
public static Dog maxDog(Dog d1, Dog d2){ 
    if (dl. weightInPounds d2.weightInPounds) {
        return d1;
    }
    return d2;
}

public Dog maxDog(Dog d2){
    /*非静态方法,因为是由特定的dog进行判断*/
    if (this.weightInPounds>d2.weightInPound){
     return this;
    }
    return d2;
}
}

在一个类中定义的变量或方法也称为该类的成员.
使用类名访问静态成员,例如Dog.binomen.
不能使用类名调用非静态成员:Dog.makeNoise
静态方法必须通过特定的实例访问实时变量,例如d1.

比如我们删除这个方法Dog maxDog(Dog d2)编译器报错。对于非静态成员,如果只有一个方法的非静态版,就不能用类名来运行函数;如果有一个静态方法,并且想访问某种实例变量,必须指明是哪个实例(比如里面的this.)

回答以下代码会输出什么?

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;
        }
    }
public static class Dog {
      /* Size of the dog in standard dog size units. */
      public int size;

      /* This is a constructor. It tells us how to construct
	 * dogs from our ideal notion of dogness. */

      public Dog(int s) {
         size = s;
      }

      public void makeNoise() {
         if (size < 10) {
            System.out.println("hideous yapping");
         } else if (size < 30) {
            System.out.println("bark!");
         } else {
            System.out.println("woof!");
         }
      }

      /* Return the larger of dog d1 and dog d2. */
      public static Dog maxDog(Dog d1, Dog d2) {
         if (d1.size > d2.size) {
            return d1;
         }
         return d2;
      }   
   }
}

这是一个java可视化网站    Java Visualizer (uwaterloo.ca)对以上问题做出回答!

一点扩展在creating and defining classes9/10中0.0-2.20的话

现在要求创建一个程序ArgsSum,打印出命令参数的总和,假设他们是数字

public class ArgsSum {
    public static void main(String[] args) {
        int N = args.length;
        int i = 0;
        int sum = 0;
        while (i < N) {
            sum = sum + Integer.parseInt(args[i]);/*string to int的方法*/
            i = i + 1;
        }
        System.out.println(sum);
    }
}

Libraries库的使用 推荐使用stackoverflow

普林斯顿大学library,请做project0?