Java学习笔记
注:资料整理于b站韩顺平java零基础教学。
文章目录
java特性
1.面向对象、健壮性
2.跨平台性:一个编译好的.class文件可以在多个系统下运行。
3.解释型:如javascript,php,java。不能直接被机器执行,需要解释器来执行。
【区别】可以直接在机器上运行
java运行
1.jvm:java虚拟机,包含在jdk中。解释-翻译-执行。”一次编译,到处运行“
2.javac:用于编译。将java文件生成.class字节码文件。
3.jre:java运行环境,包含在jdk中。
总结:
1.JDK=JRE+开发工具;
2.JRE+JVM+Java SE标准类库(java核心类库);
4.如果仅仅运行开发好的.class文件,就只需要JRE。
关于cmd编码
1.使用 javac test01.java
在cmd运行时,提示GBK等中文乱码问题:
在cmd输入 CHCP 65001
,意思是将cmd编码改为UTF-8
2.(若未解决)编译时使用 javac -encoding UTF-8 test01.java
编码设置:
cmd | 含义 |
---|---|
chcp 65001 | UTF-8 |
chcp 950 | 繁体中文 |
chcp 936 | 简体中文(GBK) |
chcp 437 | MS-DOS美国英语 |
设置系统变量:
变量名:JAVA_TOOL_OPTIONS
变量内容:-Dfile.encoding=UTF-8
java开发细节
1.java严格区分大小写
2.一个源文件中最多只能有一个public类,其他类不限个数。
3.如果源文件指包含一个public类,则文件名必须按类名命名。
4.\r表示回车,会删除\r前面的文本,只打印\r后面的内容。
5.生成文档注释:
javadoc -d D:\\AAA\\test -author -version test01.java
[生成文件的路径] [标签] [java文件名]
6.windows dos下命令
创建文件夹: md [文件夹名]
//可以创建多个文件,输入多个文件名即可
删除文件夹: rd [文件夹名]
//可以删除多个文件,输入多个文件名即可
删除文件: del [文件名]
清屏:cls
退出:exit
复制:copy [文件名] [路径,包含文件名],例如: copy text.txt D:\ok.2txt
剪切:move
输入内容到文件:echo
以树状结构展示文件:tree
7.关于路径
相对路径:从当前目录开始定位,形成的路径;
绝对路径:从根目录开始定位,形成的路径。
8.path环境变量:
JAVA_HOME指向JDK安装的主目录
9.行宽不要超过80字符
java变量
1.基本数据类型:byte-1, short-2, int-4, long-8, float-4, double-8, char-2, boolean-1等
浮点数=符号位+指数位+尾数位,尾数部分可能丢失,造成精度损失。
数据类型大小不受平台限制(java具有跨平台性),都是固定大小。
2.引用数据类型:类class, 接口interface, 数组[]。
3.尽量小,不要大,占内存。
4.byte(字节)是基本存储单位,bit是最小存储单位。1 byte = 8 bit
5.浮点数运算时,要注意精度问题。在比较时,可以将两个变量相减取绝对值,其值在某个范围(0.001)内即视为正确。
如,Math.abs(a - b)
6.字符:单引号; 字符串:双引号。
字符类型本质: 1)字符型存储到计算机中,需要将字符对应的码值找出来; 2)字符和码值的对应关系是通过字符编码表决定的。
ASCII编码表: 一个字节表示,128个字符,实际上一个字节可以表示出256个字符,只用了128个。
unicode编码表: 用两个字节表示字符,字母和汉字统一占两个字节。
utf-8编码表: 字母1字节,汉字3字节。
gbk:可以表示汉字,且范围更广。字母1字节,汉字2字节。
big5:繁体中文, 香港, 台湾。
7.char short byte 不可互相转换,会出错。
8.字符串转换 :
String c = "234";
int num1 = Integer.parseInt(c);
byte num2 = Byte.parseByte(c);
double num3 = Double.parseDouble(c);
float num4 = Float.parseFloat(c);
short num5 = Short.parseShort(c);
boolean num6 = Boolean.parseBoolean(c);
java api 接口文档
1.www.matools.com 中文接口在线文档
2.思路:包–类–方法
java 算数运算符
1.题目一
int i = 1;
i = i++;
System.out.println(i);
问:结果是多少?为什么?
答:结果是1,过程为:temp=i; i=i+1; i=temp;
2.题目二
int i = 1;
i = ++i;
System.out.println(i);
问:结果是多少?为什么?
答:结果是2,过程为: i=i+1; temp=i; i=temp;
java 键盘输入
例一:
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("please input your name:");
String name = myScanner.next();
System.out.println("please input your age:");
int age = myScanner.nextInt();
System.out.println("please input your salary:");
double salary = myScanner.nextDouble();
System.out.println("您的信息如下:");
System.out.println("name:" + name + "\nage:" + age + "\nsalary:" +salary);
}
}
关于原码、反码、补码 [!!背下来—很重要!!]
二进制中 0表示正数,1表示负数。
1.正数的原码、反码、补码是一样的;
2.负数的反码=它的原码符号位不变,其它位取反;
3.负数的补码=它的反码+1, 负数的反码=负数的补码-1;
4.0的反码、补码都是0;
5.java没有无符号数,即java中数都是有符号的;
6.在计算机运算时,都是以补码的方式运算的;
7.当我们看运算结果时,要看他的原码;
位移:左移一位等于×2; 右移一位等于÷2
注意:小数参与运算时,得到的是近似值
条件语句
1.if-else 单分支、双分支、多分支。嵌套不要超过三层。
// [插]读取键盘输入的字符:先接收字符串,再接收字符串的第一个字符
char gender = myscanner.next().charAt(0);
- switch语句; for循环 ; while循环; do-while循环
例一:
public class test01{
public static void main(String[] args) {
for (int i = 1; i<=5; i++){
System.out.println(i+"+"+(5-i)+"=5");
}
}
}
例二:
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
Scanner myscanner = new Scanner(System.in);
// 要在循环体外面声明变量answer,否在在while判断时无法读取answer。(变量作用域问题)
char answer = ' ';
do {
System.out.println("五连鞭啪啪");
System.out.println("还钱y/n");
answer = myscanner.next().charAt(0);
}while (answer !='y');
}
}
多重循环
例一:
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
/*
统计三个班的成绩,每个班5人,求每个班的平均分和所有班级的平均分
思路:1.输入每个班内部5个人的成绩,外循环3个班级;
2.内循环数据用于求班内平均分,外循环数据求所有班级平均分
*/
Scanner myscanner = new Scanner(System.in);
double res = 0, sum =0, avg = 0;
for (int i=1; i<=3; i++){
double sum_class = 0;
double avg_class = 0;
for (int j=1; j<=5; j++){
System.out.println("请输入"+i+"班第"+j+"位同学的成绩:");
double score = myscanner.nextDouble();
sum_class += score;
avg_class = sum_class / 5;
}
System.out.println(i+"班的平均分为:"+avg_class);
sum += avg_class;
}
avg = sum / 3;
System.out.println("所有班級的平均分为:"+avg);
}
}
例二:
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
/*
统计三个班及格人数,每个班5人。
*/
Scanner myscanner = new Scanner(System.in);
int count = 0;
for (int i=1; i<=3; i++){
for (int j=1; j<=5; j++){
System.out.println("请输入"+i+"班第"+j+"位同学的成绩:");
double score = myscanner.nextDouble();
if (score >= 60){
count++;
}
}
}
System.out.println("三个班級及格的人数为:"+count);
}
}
例三:
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
/*
九九乘法表
思路: 1.按行输出;1*1 | 1*2 2*2 | 1*3 2*3 3*3
i == j 下一行,每次从1开始,左边内循环,右边外循环
*/
for (int right=1; right<=9; right++){
for (int left=1; left<=right; left++){
int res = left * right;
System.out.print(left+"*"+right+"="+res+"\t");
}
System.out.println();
}
}
}
例四:
[初级]
public class test01{
public static void main(String[] args) {
/*
打印金字塔
思路:外循坏四层,内层
第一层 1 空格4
第二层 3 空格3
第三层 5 空格2
第四层 7 空格1
*/
for (int i=1; i<=5; i++){
for (int j=1; j<=5-i; j++){
System.out.print(" ");
}
for (int j=1; j<=i*2-1; j++){
System.out.print("*");
}
System.out.println();
}
}
}
[升级版]
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
/*
打印金字塔
思路:外循坏四层,内层
第一层 1 空格4
第二层 3 空格3
第三层 5 空格2
第四层 7 空格1
*/
Scanner myscanner = new Scanner(System.in);
System.out.println("请输入行数:");
int total = myscanner.nextInt();
for (int i=1; i<=total; i++){
for (int j=1; j<=total-i; j++){
System.out.print(" ");
}
for (int j=1; j<=i*2-1; j++){
if (j==1 || j==i*2-1 || i==total){
System.out.print("*");
}else {
System.out.print(" ");
}
}
System.out.println();
}
}
}
[equals匹配]
import java.util.Scanner;
public class test01{
// 登录验证,一共三次机会,用户名为丁真,密码666显示登陆成功。
// 否则提示还有几次机会,使用for+break完成。
public static void main(String[] args) {
Scanner myscanner = new Scanner(System.in);
String name = "丁真";
String passwd = "666";
for (int i=1; i<=3 ; i++){
System.out.println("请输入用户名:");
String name_in = myscanner.next();
System.out.println("请输入密码:");
String passwd_in = myscanner.next();
if(name_in.equals(name) && passwd_in.equals(passwd)){
System.out.println("登录成功");
break;
}else {
int chance = 3-i;
if (chance==0) {
System.out.println("登录失败");
break;
}
System.out.println("用户名或密码错误,您还有"+chance+"次机会");
}
}
}
}
代码练习
[1]
public class test01{
// 某人有100,000元,每经过一次路口,需要交费,规则如下:
// 现金>50000时,每次交5%
// 现金<=50000时,每次交1000
// 计算该人可以经过多少次路口?使用while break完成
public static void main(String[] args) {
// int cro = 0;
// double money = 100000;
// while(money>50000){
// money = money - money*0.005;
// cro += 1;
// }
// System.out.println(money);
// while(money<=50000 && money>=1000){
// money -= 1000;
// cro += 1;
// }
// System.out.println("一共经过"+cro+"次路口");
// System.out.println(money);
int cro = 0;
double money = 100000;
while(money>=1000){
while(money>50000){
money = money - money*0.005;
cro += 1;
}
money -= 1000;
cro += 1;
}
System.out.println("一共经过"+cro+"次路口");
System.out.println(money);
}
}
[2]
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
// 判断整数大于小于还是等于0
// 思路:取一个整数,if>0 else if =0
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入一个整数");
int num = myScanner.nextInt();
if (num > 0){
System.out.println("这个整数为正整数");
} else if (num == 0) {
System.out.println("这个整数等于0");
} else {
System.out.println("这个整数为负数");
}
}
}
数组
import java.util.Scanner;
public class test01{
public static void main(String[] args) {
// 翻转数组
int[] arr={11,22,33,45,56};
int tmp = 0;
for (int i=0; i<arr.length/2; i++){
tmp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = tmp;
}
for (int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}