对于java或者其他编程语言的学习,没有良好的学习认知和习惯是无法高效快速掌握的,为了避免繁文缛节,仅用关键句列出(方法学习自韩顺平老师)
(1)学习过程要高效且愉快——通过搭建游戏、好玩的项目边玩边学
(2)先建立一个整体框架,然后再做细节——要有整体的知识体系(笔记目录整体来看就是框架了)
(3)先知道怎么去做,然后再去琢磨为什么
(4)不是会了再做,而是做了才会,是“做中学”的过程
(5)适当囫囵吞枣,不需要每一个细节都抠
(6)用到什么再学什么
(7)学习软件编程的初始阶段应该是在琢磨别人怎么做,而不是我认为应该怎么做的过程
这次笔记的主要内容是计算机进制转换、java变量及运算、java语句结构、数组字符串。最后给出实例并学习java错误的调试方式。
笔记的核心原则是:精简易懂+容易复现
(1)概述
计算机在设计出来后,能够识别的数制是二进制;而我们日常生活所用的是十进制。拿我们日常的十进制来说:0-9,逢十进位,这就是十进制,其他二进制、八进制、十六进制等都可以依次类推。其中,十六进制的基本数字是0-9,ABCDEF
(2)进制转换
详细可阅读博文:计算机基础进制转换(二进制、八进制、十进制、十六进制)
此处仅给出总结性结论
(3)java编码实现
该代码仅用于数值转换使用,而非知识点学习,可囫囵吞枣只用即可,具体细节知识后续会提及。
代码源自网络
// 作者:网络
// 功能:用来实现进制数之间的转换功能。
// 日期:2020年5月24日
package calculate;
public class conversionNumber {
/**
*② 算法思想是先把一个m进制的数转换为10进制
* 再将转换的十进制数转换为要转换的n进制数。
*/
public static void main(String[] args){
input();
}
/**
*该函数,用来实现十进制数转换为任意进制数
*
*
*/
public static void changeTenToNum(int ten,int number){
int sum=0;
int i=0;
int j=0;
while(ten>0){
int remainder=ten%number;
ten =ten/number;
sum+=remainder*Math.pow(10,j);
j++;
}
System.out.println("\n"+"结果为:"+sum);
}
/**
*input函数用来实现数据的输入输出功能。
*/
public static void input(){
boolean flag=true;
System.out.println("输入0结束循环\n");
while(flag){
System.out.println("\n请输入要转换的进制数:\n");
java.util.Scanner read=new java.util.Scanner(System.in);
int fristNum=read.nextInt();
if(fristNum==0)
{
flag=false;
System.out.println("\n你已结束了该算法,请重新进入!\n");
break;
}
System.out.println("请输入该数字是几进位数:\n");
int secondNum=read.nextInt();
if(secondNum==0)
{
flag=false;
System.out.println("\n你已结束了该算法,请重新进入!\n");
break;
}
int copy=fristNum;
/*
下面的while循环和if判断语句,用来实现判断输入数字的准确性。
*/
while(fristNum>0){
int judgment=fristNum%10;
fristNum /=10;
if(judgment>=secondNum){
System.out.println("你输入了一个错误的数字,可能是该数字与其进制数不匹配!");
flag=false;
break;
}
}
if(flag==false){
flag=true;
continue;
}
fristNum=copy;
System.out.println("请输入要转换为几进位数:\n");
int thirdlyNum=read.nextInt();
if(thirdlyNum==0)
{
flag=false;
System.out.println("\n你已结束了该算法,请重新进入!\n");
break;
}
changeTenToNum(changeNumToTen(fristNum,secondNum),thirdlyNum);
}
}
/**
*changeNumToTen函数用于实现n进制数转换为十进制数。
*/
public static int changeNumToTen(int n,int num)
{
int i=0;
int sum=0;
int j=0;
while(n>0){
i=n%10;
n/=10;
sum+=i*Math.pow(num,j);
j++;
}
return sum;
}
}
(4)二进制补码
计算机系统的内部,数值以二进制的补码形式存储。在java程序中输入的十进制数据都会被自动转换为二进制,java内部也以二进制来进行数值计算,但返回的结果是十进制
补码可以将符号位和其他位统一处理;最高位不再表示数值,而是最为符号位,可以讲数值折半;减法也可以按假发来处理
计算机中正负数的关系是取反加一
补码计算:
二进制的最高位是符号位,0表示正数,1表示负数;正数的值是其本身,负数的值是最高位不变,其他位逐渐取反。两数相加,若最高位有进位,则进位被舍弃,例如:
正数+负数=模(某种类型数据的总数)
(1)数据类型
java定义了基本数据类型、引用数据类型和自定义类型
(2)变量概述
在计算机的高级语言中用变量来管理引用类型的数据,
其中,变量是可变的量,相对应的常量就是不可变的量,字面量是指java常/变量中存放的具体数据
变量作用域:java用一对大括号作为语句块的范围,称为作用域,作用域中的变量是不能重复定义的
变量可以简化运算,能够保存多种数据类型
(3)变量的命名规则
首字母采用英文、$或下划线;名称由字母、数字和下划线组成
命名遵循见名知义的原则,首字母建议不用大写字母,用驼峰命名法命名多个单词组成的变量名。
(4)变量的定义、初始化
定义:类型 变量名1 变量名2…;
每种变量必须属于一种数据类型
初始化:age=23;
(5)包装类
java为基本数据类型提供了对应的类,这些类称为包装类。包装类封装了一些很实用的方法和常量,在集合中用来定义集合元素的类型
(1)整数类型
java有四种整数类型:byte/short/int/long
java默认整数计算的结果是int类型
整数的字面量是int类型,若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L或者l表示该值是long类型
java底层byte和short按照32位计算
(2)浮点类型
浮点类型用于表示小数的数据类型,包括float和double两种,默认的计算结果和字面量都是double类型
科学计算法:
float类型共32位,1位位符号位,指数8位,尾数23位;精度是23位,小数是以尾数长度表示精确度
(3)字符类型
char的字面量可以是一个英文字母、字符和一个汉字,并且由单引号包括
java底层使用一个16位Unicode字符编码处理
(4)转义符
转义字符是“\”,通过转义字符,可表示一些特殊的字符
(5)布尔类型
布尔类型是用来表示肯定或否定两种可能,常用在分支语句、循环语句中,只有两个值:true和false表示;
定义:boolean isPass;
java中经常出现不同类型数据进行相互转换的现象
(1)自动类型转换
小类型向大类型的转换会自动完成,即不需要程序员编写额外的代码,由JVM负责
自动类型转换也叫“隐式类型转换”
转换规则:符号位会自动扩展,负数补1,正数补0
自动转换包括的情况:
(2)强制转换
强制转换过程中可能发生数据溢出。
(3)转换一览图(图片来源:https://www.cnblogs.com/tyyt/p/10398270.html)
(1)自运算
自增: i=i+1,space=space+""; ++i,(先加1);i++(后加1);i+=n
自减:–i (先减1);i++(后加1);i-=n
自乘:i*=n
自除:i/=n
(2)关系运算
关系运算种类如下,结果只有true和false两种
(3)逻辑运算
逻辑运算种类如下,结果只有true和false两种
(1)if 判断语句
if语句用于判断不同的条件,根据关系运算、逻辑运算等得到的true、false等逻辑值来决定执行不同的代码
格式一:
if (Score>=60){
System.out.println(score+"及格")
}
格式二:
if (a>b){
sysytem.out.println(a+"max");
}
else{
system.out.println(b+"min");
}
(2)Switch语句
Scanner scanner=new Scanner(System.in);
System.out.println("输入月份");
int month=scanner.nextInt();
switch(month){
case 1;
case 3;
case 5;
case 7;
case 8;
case 10;
case 12;
System,out,println("31");
break;
case 4;
case 6;
case 9;
case 11;
System,out.println("30");
break;
case 2;
System,out.println("28");
break;
default;
system.out.println("输入的月份有误");
}
(3)循环语句
循环语句有while和for循环两类
· while 循环
int i=1;
while(i<=20){
System.out.println("上课迟到,罚做俯卧撑"+i+"次");
i++;
}
int i=1;
do{
System.out.println("上课迟到,罚做俯卧撑"+i+"次");
i++;
}while (i<=20);
·for循环
for (int i=1;i<=20;i++){
System,out.println("上课迟到,罚做俯卧撑"+i+"次");
}
(1)定义
数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来做标识
(2)分类
一维、二维、多维
(3)数组的声明
声明形式有如下两种
但是,为数组分配内存空间,如果不分配内存,将不能访问它的任何元素,我们使用new关键字来为数组分配内存空间
int arrayDemo[];
arrayDemo=new int[3];
int[] acore;
acore =new int[3];
初始化方式有两种:静态初始化和动态初始化
(5)数组的使用
int score[]={43,34,5,66,12};
int max,min;
max=min=scaore[0];
for(int i=0;i<score.length;i++){
if(score[i]>max){
max=score[0];
}
if(score[i]<min){
min=score[0];
}
System.out.println(max);
System.out.println(min);
(6)二维数组
声明、内存分配和一维数组类似
int score[][];
score = new int [5][5];
for (int i=0;li<score,length;i++){
for(int j=0;j<socre[i].length;j++){
System.out.println(score[i][j]+" ");
}
System.out.println();
}
静态初始化
int score[][]={{100,90},{67,70},{50,78,80}};
(1)字符串概述
·实例化String对象,直接赋值或者用new,通过new关键字创建占用空间较大。
String str="Hello";
String str=new String("hello");
System,out.println(str);
注意:字符串内容不可更改
字符串常用方法:
字符串长度:length()方法
String str="Sonny";
System,out,println(str.length());
}
字符串转换为数组:toCharArray();
char data[]=str,toCharArray();
for(int i=0;i<data,length;i++){
System,out,println(data[i]);
}
从字符串中取出特定位置的字符:charAt();
char data[]=str,toCharArray();
System,out,println(str.charAt(3));
字符串与byte数组的转换方法:getBytes()
byte data[]=str.getBytes();
for(int i=0;i<data,length;i++){
System,out,println(new String(data));
}
过滤字符串中存在的字符indexOf()
String str="[email protected]";
System,out,println(str.indexOf("@"));
去掉字符串中的空格:trim();
从字符串中取出子字符串:subString()
大小写转换:toLowerCase() toUpperCase()
判断 字符串开头结尾字符:endsWith() startWith()
替换String字符串中的一个字符:replace()
(2)args数组
通过main方法的args数组可以从控制台获取一组字符串数据
(3)scanner
Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据,位于java.util.Scanner包中
string next():接收控制台输入的一个字符串
string nextLine():接收控制台输入的一个字符串(可以接收空格)
string nextInt():接收控制台输入的一个int数据
string nextDouble():接收控制台输入的一个double数据
string nextBoolean():接收控制台输入的一个boolean数据
可以通过charAt()方法从next()或nextLine()中获取输入的字符
例如:
“abc”.charAt(0),可获取第一个字母a
步骤:
Scanner scanner =new Scanner(System.in);
System.out.println("")
String name = scanner.next();
(4)StringBuffer
缓冲区,本身也是操作字符串,但是与String不同,它是可以更改的
属于一种操作类,必须通过实例化操作
常用方法:
append():追加内容
insert():插入内容
replace()::替换内容
indexOf():过滤字符串
StringBuffer sb=new StringBuffer();
sb.append("Sonny");
sb.insert(0,"love");
System.out.println(sb);
(5)StringBuilder
一个可变的字符序列,被设计作用为StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,建议优先考虑该类,速度比StringBuffer要快。但是如果涉及到线程安全方面,建议使用StringBuffer
常用方法:
append():追加内容
insert():插入内容
(1)程序错误类型
程序的错误分为编译期语法错误、运行期异常错误、运行期逻辑错误
(2)调试——Debug
先将下面的程序输入到eclipse中
package com.sonny.exc;
public class debug00 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=100;
int b=10;
System.out.println("a="+a+"\tb="+b);
a=b;
b=a;
System.out.println("a="+a+"\tb="+b);
}
}
debug调试按钮如图
如果没有跳出debug窗口,可在右上角选择debug
断点是在源代码的可执行部分的指定行(断点设置位置应该是程序员怀疑错误代码的附近位置)设置一个标志,通过设置断点可以快速执行断点之前的代码,然后在调试运行方式下,程序运行到该断点标志处会自动暂停,等待下一步操作;这时可以换单个命令运行的方式来运行程序,查找程序中的逻辑错误。
(1)异常是什么
异常是导致程序中断运行的一种指令流,如果不对异常进行正确处理,则可能导致程序的中断执行,造成不必要的损失。
例如错误的代码:
package com.sonny.exc;
class Exc{
int i =10;
}
public class exceotiionDemo01 {
public static void main(String[] args) {
int a=10;
int b=0;
int **temp=a/b;**
System.out.println(temp);
}
}
(2)异常的格式:
try里面放置的是可能出现异常的语句,在catch中对异常进行捕获,可以多个模块一起进行,finally是程序一定会运行的部分,不管是否有异常
对前面提到的异常程序进行捕获:
package com.sonny.exc;
class Exc{
int i =10;
}
public class exceotiionDemo01 {
public static void main(String[] args) {
int a=10;
int b=0;
int temp=0;
try {
temp=a/b;
} catch (Exception e) {
System.out.println(e);
// TODO: handle exception
}
System.out.println(temp);
}
}
package com.sonny.exc;
class Exc{
int a =10;
int b =10;
}
public class exceotiionDemo01 {
public static void main(String[] args) {
int temp=0;
Exc e=null;
try {
temp=e.a/e.b;
System.out.println("程序推出");
} catch (NullPointerException e2) {
System.out.println("空指针异常"+e2);
}
catch (ArithmeticException e2) {
System.out.println("算数异常"+e2);
}finally {
System.out.println("程序推出");
}
}
}
(3)常见异常
数组越界异常:ArraylndexOutOfBoundsException
数字格式化异常:NumberFormatException
算数异常:ArithmeticException
空指针异常:NullPointerException
(4) Throws 关键字
定义一个方法时可以调用throws关键字声明,使用throws声明的方法表示此方法不处理异常,抛给方法的调用者处理
package com.sonny.exc;
public class exceptionDemo02 {
public static void main(String[] args) {
try {
tell(10, 0);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
public static void tell(int i,int j) throws ArithmeticException{
int temp=0;
temp=i/j;
System.out.println(temp);
}
}
throws关键字将异常抛出,交给方法的调用者进行处理,如果主方法抛出异常,那么将由jvm处理
package com.sonny.exc;
public class exceptionDemo02 {
public static void main(String[] args) throws Exception {
tell(10, 0);
}
public static void tell(int i,int j) throws ArithmeticException{
int temp=0;
temp=i/j;
System.out.println(temp);
}
}
throws抛出一个异常,抛出的时候直接抛出异常类的实例化对象即可
package com.sonny.exc;
public class exceptionDemo03 {
public static void main(String[] args) {
try {
throw new Exception("实例化异常对象");
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
}
(5)自定义异常
自定义异常直接继承Exception就可以完成自定义异常类
package com.sonny.exc;
class MyException extends Exception{
public MyException(String msg) {
super(msg);
}
}
public class exceptionDemo04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
throw new MyException("自定义异常");
} catch (MyException e) {
// TODO: handle exception
System.out.println(e);
}
}
}