首先去甲骨文官方网站下载JAVA SE 8的JDK开发工具包,也可以直接点击:
https://www.oracle.com/technetwork/java/javase/downloads/index.html
下载完成后,解压双击exe安装,安装路径建议放在C盘,这样也方便后期寻找。
安装完成后,在C:\Program Files\Java路径下(如果你是放在C盘的话),可以看到一个jdk一个jre,两个文件夹。

当然,这个时候还不能直接HelloWorld,还需要一步:配置环境变量。
在我的电脑右键属性,高级系统设置,点击环境变量,在系统变量新建一个变量:JAVA_HOME,变量值为C:\Program Files\Java\jdk1.8.0_191。
保存,然后在系统变量path里新建一个%JAVA_HOME%\bin,保存应用,也可以直接在变量path中新建C:\Program Files\Java\jdk1.8.0_191\bin。
这里建议使用第一种方法,后期直接改变JAVA_HOME的值就可以,而且也可以防止后期出现不匹配的情况。路径因为版本不同可能会是jdk1.8.0_152这种,不要傻乎乎的复制我的。
在cmd里输入javac,然后出来一长串的命令提示行,说明环境变量配置成功,现在就可以开始写我们的HelloWorld的啦

 下载JDK
登录www.oracle.com上进行下载,安装时关闭防火墙。
 配置环境变量
【桌面】右键【我的电脑】,依次点击【属性】【高级系统设置】【环境变量】。
在下方点击新建,变量名为【JAVA_HOME】,变量值为JDK安装目录文件夹地址,点击【确定】。
在系统变量中找到Path变量值,点击编辑,将光标移到最后面,依次输入JDKbin目录地址【%JAVA_HOME%\bin】和JREbin目录地址【%JAVA_HOME%\jre\bin】,中间用英文分号;隔开。
 配置完成,验证
打开cmd,输入java和javac验证。

计算机导论1:计算机基础

世界上第一台电子数字计算机(ENIAC):

  对于ENIACA的一个简单认识是,他是世界上第二台电子计算机,但是他是第一台通用计算机,全称为Electronic Numerical Integrator And Computer,世界上第一台电子计算机是ABC(阿塔纳索夫-贝瑞计算机)计算机,但是其不可编程,并且并非是图灵完全,只能进行简单的线性方程组的计算。所以ENIAC是第一台通用计算机。如果归根溯源,世界上第一台计算机(非电子计算机)是在17世纪的加法机,也称为帕斯卡机。
  其实现在法院已经吊销了ENIACA发明者之一莫科里的专利,并且宣布了现代计算机的基本想法是来自阿塔纳索夫,这里就不在做过多的探讨。  其实现在法院已经吊销了ENIACA发明者之一莫科里的专利,并且宣布了现代计算机的基本想法是来自阿塔纳索夫,这里就不在做过多的探讨。

关于冯丶诺依曼:

  计算机之父,博弈论之父,是一位科学全才。计算机科学家,物理学家,20世纪最重要的数学家之一,核武器学家,生化武器学家。
  冯·诺依曼和他的研制小组在共同讨论的基础上,发表了一个全新的“存储程序通用电子计算机方案”——EDVAC。在此过程中他对计算机的许多关键性问题的解决作出了重要贡献,从而保证了计算机的顺利问世。

计算机的发展历史:

  第一代计算机:电子管计算机

    早在1883年,爱迪生为了寻找电灯泡的最佳灯丝材料,他做了一个小小的实验,他在真空电灯泡内部碳丝附近安装了一小截铜丝,希望铜丝能阻止碳丝蒸发,然最后实验失败了,但是他发现,没有连接电路的铜丝,却因为接收到了碳丝的热电子产生了微弱的电流,他将其命名位“爱迪生效应”,1904年,英国物理学家弗莱明发明了世界上第一个二极管,使得爱迪生效应具有了实用价值。1906年,美国科学家德弗雷斯特在二极管内部的灯丝和板极之间加了一个栅板,从而发明了第一支真空三极管。世界上第一台通用电子计算机ENIAC就是用真空电子管制作的。从此,电子计算机时代正式进入了历史的舞台。

  第二代计算机:晶体管计算机

    1948年,贝尔实验室发明了晶体管,10年后,晶体管取代了电子管,成为电子计算机的新材料,晶体管计算机就此诞生,从而开辟了电子计算机的新纪元。并且此时在软件上广泛的采用了高级语言,并且出现了早期的操作系统。

  第三代计算机:中小规模集成电路计算机

    由于半导体技术的飞速发展,人们成功制造了集成电路,在几平方毫米的基片内,集成了几十个或者上百个电子元件组成的逻辑电路。从此,中小规模集成电路成为了计算机的主要部件。主存储器也渐渐的过渡到了半导体存储器。在软件方面,有了标准化的程序设计语言和人机会话式的Basic语言,其应用领域也进一步扩大。

  第四代计算机:大规模和超大规模集成电路计算机

    随着科技的发展,人们对于计算机的要求越来越高。在科学家们的不断努力下,集成了上千甚至上万个电子元件的大规模集成电路和超大规模集成电路的出现,计算机正式进入了第四代,集成度很高的半导体存储器也完全替代了磁芯存储器。软件方面也产生了结构化程序设计和面向对象程序设计。微处理器和微型计算机在这一代也诞生并获得了快速的发展。

计算机的组成:

  计算机的组成大致分为硬件和软件两部分。计算机系统也分为硬件系统和软件系统两部分。
  计算机硬件,即完成输入,存储,处理和输出功能的具体设备。
  计算机软件,既控制硬件正确有效的完成各项任务。

硬件系统:

  硬件系统分为主机和外围设备,主机包含中央处理器(CPU)和内存储器,外围设备又分为外存储器,输入设备和输出设备。

  中央处理器(CPU):

    中央处理器,又叫CPU,全称central processing unit,电脑的核心配件,其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。
    中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速缓冲存储器及实现它们之间联系的数据、控制的总线。它的功能主要是处理指令、执行操作、控制时间、处理数据。根据冯诺依曼体系,CPU的工作分为个阶段:取指令阶段、指令译码阶段、执行指令阶段、访存取数和结果写回。

  内存储器:

    内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是暂时存放CPU中的运算数据,计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。
    内存就是又称为主存,是CPU能直接进行寻址的存储空间,由半导体制成,包括随机存储器(RAM),只读存储器(ROM),以及高速缓冲存储器(CACHE)。

  只读存储器(ROM):

    ROM表示只读存储器(Read Only Memory),ROM在制造出来的时候,信息就已经被存入并永久保存,这些信息只能读出,不能写入。ROM一般用于存放计算机的基本程序和数据。

  随机存储器(RAM):

    随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。我们通常所使用的内存条就是我们所说的随机存储器。

  高速缓冲存储器(CACHE):

    CACHE位于CPU与内存之间,是一个读写速度比内存更快的存储器,我们所遇到的一级缓存,二级缓存和三级缓存就是说的高速缓冲存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。

软件系统:

  软件系统分为系统软件和应用软件。
  系统软件包括我们常用的操作系统(Windows、DOS、Linux、UNIX、苹果操作系统)、语言处理程序(汇编语言汇编器、C语言编译器等编译软件)、数据库管理系统(Foxpro、Access、Oracle、Sybase、DB2和Informix)和系统辅助处理程序(软件研发开发工具)。
  应用软件包括数据处理软件,文件处理软件,CAD软件,网页制作软件等。
  总结可知,计算机的组成为:

计算机组成

计算器存储器的计量单位:

  8bit = 1byte
  1024byte = 1KB
  1024KB = 1MB
  1024MB = 1GM
  1024GB = 1TB
  1024TB = 1PB
  1024PB = 1EB
    关于单位还有很多很多,再此就不一一列举,需注意的是,在实际的计算机存储单位里,换算率时约等于1000。

数制系统

  数制,又称为“计数制”,是用一组固定的符号和统一的规则来表示数值的方法。任何一个数制都包含两个基本要素:基数和位权。
  常用的数制系统为:十进制D(decimal)、二进制B(binary)、八进制O(octal)、十六进制H(hexadecimal)。
  在计算机系统内部,并不是我们所长使用的十进制,而是二进制。人们输入计算机的十进制被转换成二进制进行计算,计算后的结果又由二进制转换成十进制,当然,这些都是由操作系统自动去完成的,所以要了解计算机底层,学习汇编语言,必须要了解二进制。

  数制系统转换:

    一、其他进制转换为十进制:

      其他进制转换为十进制,最常用的方法就是按权展开法。按权位(权位的大小以基数为底,几进制的基数就为几)互相展开,并各项相加。如:
                    N = (10110.101)B = (?)D
N = 1×24+0×23+1×22+1×21+0×20+1×2-1+0×2-2+1×2-3 = (22.625)D

    二、十进制转换为其他进制

      分为两部分计算,即整数部分和小数部分。
      整数部分用短除法(基数除法),既我们将要转换的数除以新的进制的基数,把余数作为新进制的最低位,把上一次得的商在除以新的进制基数,把余数作为新进制的次低位,继续上一步,直到最后的商为零,这时的余数就是新进制的最高位。

        

      小数部分则是短乘法(基数乘法),既我们把要转换数的小数部分乘以新进制的基数,把得到的整数部分作为新进制小数部分的最高位,把上一步得的小数部分再乘以新进制的基数,把整数部分作为新进制小数部分的次高位,继续上一步,直到小数部分变成零为止。或者达到特定的要求也可以。

  三、二进制与八进制、十六进制的转换

      二进制转换为八进制、十六进制,把要转换的二进制从低位到高位每3位或4位一组,高位不足时在有效位前面补0,然后把每组二进制数转换成相对应的八进制或十六进制即可。

原码、反码、补码:

  一、机器数和真值:

    1、机器数

      一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。比如,十进制中的数+3,计算机字长为8位,转换成二进制就是00000011,如果是-3,就是10000011。那么此时,00000011和10000011就被称为机器数。

    2、真值

      因为第一位是符号位,所以机器数的所表现出来的形式值不等于真正的数值,例如上面的有符号数10000011,他的按照常理运算出来的结果是131,而第一位是符号位,所以真实的数值是-3.所以为了区别,将带符号位的机器数对应的真正的数值称之为真值。

  二、原码、反码、补码的基础概念和运算:

      对于一个数,计算机要使用一定的编码方式进行存储。原码,反码,补码是机器存储一个具体数字的编码方式。

    原码:

      原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
         【+1】=00000001
         【-1】=10000001
      根据第一位是符号位得知,8进制的取值范围是:
          【11111111,011111111】
      既
             【-127,127】

    反码:

      反码的表示方式是:正数的反码就是他本身,负数的反码是在其原码的基础上,符号位不变,其余数字各位取反。
【+1】=【00000001】=【00000001】
【-1】=【10000001】=【11111110】

    补码:

      补码的表示方式是:正数的补码就是他本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)。
【+1】=【00000001】=【00000001】=【00000001】
【-1】=【10000001】=【11111110】=【11111111】
      由此可知,原码、反码、补码是完全不同的,我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1=1+(-1)=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。
      来看最简单的一个十进制表达式:1-1=0
      如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。既
1-1=1+(-1)=【00000001】+【10000001】=【10000010】=-2
      由此可见,对于减法来说,单用原码进行计算,最终得到的实际结果与我们想要得到的结果不同。所以这个时候,反码出现了:
      继续计算一个十进制表达式:1-1=0
1-1=1+(-1)=【00000001】+【10000001】=【00000001】+【11111110】=【11111111】=【100000000】=-0
      此时我们发现,用反码进行计算时,我们的数值部分表示是正确的。现在的问题就出在了符号位上,0与-0在我们日常理解中是可以理解并且没有任何区别的,但是在计算机中,他却有两个编码表示0,既【100000000】和【000000000】.
      这个时候,补码出现了。他的出现解决了0的符号位以及两个编码的问题:
      咱们再一次的继续计算一个十进制表达式:1-1=0
 1-1=1+(-1)=【00000001】+【10000001】=【00000001】+【11111111】=【00000000】=【00000000】=0
      如此一来,0就可以直接用【00000000】来进行表示,而之前出现-0的问题也就不是什么问题了,那计算出来的【10000000】怎么办呢,我们就将它来表示-128。既:
(-1)+(-127)=【10000001】+【11111111】=【11111111】+【10000001】=【100000000】
      根据此公式我们要注意,当表示的字长为8位时,由于-128是使用以前-0的补码来进行表示的,所以-128并没有反码和原码这一说。所以,我们要对范围做一个明确的定义:
      对于原码和反码:【-127,+127】
      对于补码:【-128,+127】

此时,我们来深入它(前方高能):

  如果按照一年有12个月看成是一个12进制的数,则如果当前是6月份。我们希望回到4月份,不考虑年份的限制因素,则(mod为取模操作):
  1、倒退2个月:6-2=4
  2、推进10个月:(6+10)mod 12=4
  3、推进10+12=22个月:(6+22)mod 12 =4
  根据同余和负数取模的概念:
  倒退2个月 = 推进10个月
  倒退4个月 = 推进8个月
  倒退5个月 = 推进7个月
  (-2)mod 12 = 10 mod 12 =10
  (-4)mod 12 =8 mod 12 =8
  由此可见,-4与8是同余的,-2与10是同余的。根据同余的反身性特性以及线性运算定理,我们就可以为负数找到一个正数的同余数。所以我们回到二进制:
  2-1=2+(-1)=【00000010】+【10000001】=【00000010】+【11111110】
  此时要认定,-1的反码是11111110,此时,如果我们要把【11111110】看作是原码,则【11111110】 = -126,这里如果i不看符号位,则是126,此时我们发现:
  (-1)mod 127 = 126
  126 mod 127 = 126
  根据线性运算定理,2-1 与 2+126的余数相同,而且他们的余数就是我们所希望的2-1=1。
  然而反码能够计算出来,那么在反码的基础上+1(既补码)为什么也能得到正确的结果呢?
  2-1=2+(-1)=【00000010】+【10000001】=【00000010】+【11111111】
  此时我们将【11111111】当作原码,去除符号位
  【01111111】 = 127
  根据同余的线性运算,所以我们在反码的基础上+1,只能只是相当于增加的膜的值,此时一年相当于128个刻度转一轮,所以补码的范围应该是【-128,128】,但是由于0的特殊性,128无法表达,所以此时的范围是【-128,127】。

一、 获取JLayer工具包

1.1 下载JLayer

官网地址
www.javazoom.net
项目地址
http://www.javazoom.net/javalayer/javalayer.html
下载地址
http://www.javazoom.net/javalayer/sources/jlayer1.0.1.tar.gz
需要使用的包
下载地址下载之后,解压之后文件夹中的jl1.0.1.jar文件就是我们需要使用的工具包。

二、将工具包配置到项目中

创建项目时,建议JDK的版本为1.8,jdk9以及以上版本可能会出现播放没有声音的bug。这个bug主要来源于jdk声音播放本身。

2.1 拷贝帮组文件到项目文件夹

将jar包放置到项目中的指定目录中,我们这里先创建一个libs的目录,并且将jar文件拷贝到目录中。如下图1所示

添加文件到项目中
【图1 添加图片到项目】

2.2 配置jar包到构建路径中

在eclipse项目中,选定上一步复制过来的jar文件。右键->弹出菜单中选择Build Path -> Add To Build Path。将jar包设置到配置路劲中,操作如下图2图3所示。

添加文件到构建路径
【图2 添加图片到项目】
添加成功后
【图3 添加图片到项目】

三、添加音乐文件到项目中

在项目中新建文件夹audios,并且准备一个音乐文件放置到文件夹中。如下图4所示。

添加音乐文件
【图4 添加音乐文件】

四、编写代码以及执行播放

新建测试类SimpleMusicPlayer.java,实现音乐播放
实现步骤如下:
1. 创建文件输入流
2. 创建音乐播放器对象
3. 使用音乐播放器对象播放音乐

播放代码如下

package com.xuetang9.xm.simpleplayer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

/**演示JLayer播放音乐
 * @author 老九.大师兄
 * @date 2019年7月29日 - 下午8:34:04
 * @copyright © xuetang9
 * @address 成都市西部国际金融中心2栋2201
 * @version 1.0
 */
public class SimpleMusicPlayer {
    public static void main(String[] args) {
        try {
            String musicPath = "audios/那英 - 雾里看花.mp3";
            // 创建音乐文件输入流
            FileInputStream inMusic = new FileInputStream(new File(musicPath));
            // 创建音乐播放器
            Player player = new Player(inMusic);
            System.out.println("开始播放:"+musicPath);
            // 播放音乐,音乐播放结束后程序才会结束
            player.play();
        } catch (FileNotFoundException | JavaLayerException e) {
            e.printStackTrace();
        }
    }
}

最后执行该代码即可成功播放音乐。控制台结果如下图5所示,当然音乐就需要小伙伴在自己电脑上播放才能感受咯。
音乐播放结果
【图5 音乐播放结果】

五、总结

整个操作其实非常简单总结如下:
1. 创建项目
2. 准备依赖jar包
3. 配置jar包到构建路径中
4. 准备希望播放的音乐文件
5. 编写测试代码
6. 播放测试

一、使用数组的好处

1,节约变量名
2,操作方便,指对大量同类型的数据操作时

二、数组的复制

1,虚假的复制

int[] array1 = {12,23,45,22,42,32};
int[] array2 = {32,42,45,21,11,65,35,66};
System.out.println("直接复制前:");
System.out.println(array1);
System.out.println(array2);
array1 = array2;
System.out.println("直接复制后:");
System.out.println(array1);
System.out.println(array2);
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));

结果:

直接复制前:
[I@1e643faf
[I@6e8dacdf
直接复制后:
[I@6e8dacdf
[I@6e8dacdf
[32, 42, 45, 21, 11, 65, 35, 66]
[32, 42, 45, 21, 11, 65, 35, 66]

由此可以轻松看出这样直接 = 只是将array2的地址给了array1,并没有实现我们真正的目的。

2,真实的复制
因为java里数组定义时就已经确定了长度,所以想要复制一个长度不等的数组,就只能新建一个数组,再将array1指向这个新数组。
这样就有几种方法了:
1,直接用new新建一个,然后用for循环复制赋值,就能形成复制。
array1 = new int[array2.length];
2,用Arrays.copeof(),java提供的复制功能,

System.out.println("Arrays复制后:");
array1 = Arrays.copyOf(array2,array2.length);
System.out.println(array1);
System.out.println(Arrays.toString(array1));
Arrays复制后:
[I@7a79be86
[33, 42, 45, 21, 11, 65, 35, 66]

可以看到,array1的地址变成了一个新的地址

3,使用方案2的底层实现,效率高

System.arraycopy(src,srcPos,dest,destPos,length);

src – 源数组。
srcPos – 源数组中的起始位置。
dest – 目标数组。
destPos – 目的地数据中的起始位置。
length – 要复制的数组元素的数量。
要注意,这样并没有解决数组长度的问题,需要和
array1 = new int[array2.length];配合使用。
但这样比起用for循环赋值要快的多。

一,基础知识

以8位二进制为例:
原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的补码为1111 1011。
原码是方便我们人类识别的,而补码是方便计算机运算的。

在计算机中,数据都是以补码的形式存储的,如单字节5,在计算机中就表示为:0000 0101;如单字节-5,在计算机中表示为1111 1011。

在计算机运算的时候,都是以补码的方式来运算的。

二,为什么要设立补码

第一是为了能让计算机执行减法。 计算机的减法实际上都是转为加法来运算,即 a-b = a + (-b),原码和反码都实现不了这个转化,而补码能够实现:[a-b]原 ≠ a原 +(-b)原;[a-b]补 = a补 +(-b)补。

第二个原因是为了统一正0和负0
正零:0000 0000
负零:1000 0000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,转为补码时,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[1000 0000]补 = [1000 0000]反 + 1 = 1111 1111 + 1 = (1)0000 0000 = 0000 0000(最高位溢出了,符号位变成了0)
那么现在 1000 0000 这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是 -2^(n-1)到2^(n-1)-1 ,8位即是-128~127,这就是为什么取值范围里负数要多一个。

同时我们还应注意到补码的大小是跟实际的数字大小相同的,-128补码为1000 0000,-127补码为 1000 0001,比-128大1,实际也是-127比-128大1,而-1的补码为1111 1111,是负数里最大的补码,而-1也就是最大的负数,所以补码还能够很方便的比较大小。

三,对于~取反的说明

我们已经知道,在计算机中,数据都是以补码的形式存放的。
所以 \~2 = [0000 0010]取反 = [1111 1101]
以前文的知识,我们很容易知道[1111 1101] 是-3的补码,所以~2 = -3 。

i++是表达式运算后再自加1,这里的表达式指的是一次运算,不是整个表达式全算完了i才自增

int i = 1;
int j = i++ * 2 + 3 * i++;
int a = 1;
int b = 2;
System.out.printf("a++:%d,a++ + b:%d,a:%d",a++,a++ + b,a);

这里j等于8,输出为a++:1,a++ + b:4,a:3,可以从这几个输出看出i++的运行顺序

\b 退格(BS) ,将当前位置移到前一列
\f 换页(FF),将当前位置移到下页开头
\n 换行(LF) ,将当前位置移到下一行开头
\r 回车(CR) ,将当前位置移到本行开头
\t 水平制表(HT) (跳到下一个TAB位置)
\v 垂直制表(VT)
\\ 代表一个反斜线字符\’\\’
\\’ 代表一个单引号(撇号)字符
\\” 代表一个双引号字符

\0 空字符(NULL)
注:加粗的为常用

  • 反汇编指令 javap -l -c xxx.class
  • 负数取模,只与第一个操作数有关
    -5 % 2 = -1, 5 % 2 = 1, -5 % -2 = -1, 5 % -2 = 1
  • 小数也能取模
  • 二进制的负数转为十进制:先对二进制数逐位取反,对取反后的二进制数加1,加上负号,结果就是二进制负数转化成的十进制数。详细请看二进制原码反码补码相关
  • switch会扫描全部内容,全部没有匹配的,才会执行default语句,与default语句位置无关。
  • 短路指类似false && xx;true || xx这类语句,计算机只会运算前面的一半,后面的语句不会执行。
  • 变量初始化:局部变量(方法里面定义的变量)定义时必须要有初始化赋值,不然会编译错误,成员变量(类里定义的变量)可以不用初始化赋值,会默认赋值 0 或 null 。

  1. 提前预习
  2. 课后练习
  3. 重视直播。直播注意力更集中,还能和老师、其他同学互动,应该尽量参加直播。
  4. 笔记总结。学了就要总结,记下来,既是总结,让自己记得更好,还能留下记录,以后也方便查找。
  5. 有问题,先百度。不要只是单纯的查资料,还应该趁机拓展知识面,从原本的问题拓展开去,彻底弄懂。
  6. 注意知识的连接。要将新学的知识与已知的联系起来,不能孤立,形成一个体系。
  7. 记笔记要深入理解,不要抄一遍老师的叙述,应该用自己的话重新叙述一遍。