Java学习记录:基于C++的快速学习
HB小咸鱼学习记录
- 初中的时候曾经学过一点java,算是程序的敲门砖,但是没想到上了大学最先深入学习的是C语言和C++。21年初这个寒假决定在家系统学习Java和网络编程,发个帖子记录过程,方便今后查看。
【前期准备】
- Java JDK版本选择的是: “1.8.0_181”
- 编译器我选择的是: Eclipse
- 具体环境搭建方法由网络上查询得知,不多说了。
- 学习地址:(B站永远滴神)
[video(video-zPI8bhtB-1610116863147)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=797299458)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/73b9c56133cf2defc06255ca50a219156917272e.png)(title-黑马程序员Java语言入门到精通-【基础+高级】-附全套资料(IDEA版))]
【笔记一】 1- 基本语法
- C++里的include头文件和Java里的import包机制相似。
- C++和Java代码执行的起点都是main函数。
- 变量关键字与C++基本一致。值得一提的是,由于Java里没有指针,所以Java中的字符串由字符串变量String储存。使用方法与C++/STL里的string大同小异,记得Java里的String首字母要大写。
- Java中申请数组时,分为动态分配和静态分配。动态分配为new申请内存后不设置各初始值,静态分配为new申请内存后直接设置各初始值。
int[] array1 = new int[3];//动态分配 int[] array2 = new int[]{1,2,3};//静态分配
- Java中的数组和字符串都自带类似C++/STL里的方法,例如length()就是获取长度。
- 变量类型强制转换和C++一致都可以使用(int)double这样的格式进行转换。
- 字符类型与C++一致也是用的ASCII码。
- if/else条件判定语句与C++一致。
- switch关键字的使用方法与C++一致。
- for循环、while循环、do…while循环的使用方法与C++一致。
- break和continue的使用方法与C++一致。
- Java中类的思路与C++中基本一致。注意Java类中的公/私有标识符不用加 ‘:’ 。
- Java中类和方法的声明/使用方法与C++基本一致。
- 对于只使用一次的对象,可以使用匿名对象,直接new就行。
- final关键字代表最终的,不可改变的。
- 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称(); 直接声明内部类。
- 现在的编译器支持自动装箱和自动拆箱。
- 包装类除了int–Integer,char–Character,其余都是首字母大写。
- 泛型省去了类型转换的麻烦,更加安全,但是只能储存一种数据。
- native关键字,代表该方法调用的是本地操作系统的方法。
- 当方法的参数类型已经确定,但是参数个数不确定时,可以使用可变参数。
修饰符 返回值类型 方法名(数据类型…变量名){} 底层为一个数组。
【笔记二】 115-118P Scanner接收类
- Java接收输入的方式为调用Scanner类。需要导包:import java.util.Scanner;
- 接收数据的方法为:
字符串-Scanner.next()/Scanner.nextLine();
其余类型-Scanner.next类型(); 如:int-Scanner.nextInt(); double-Scanner.nextDouble();
【笔记三】 121-124P Random随机数类
- Java生成随机数的方式为调用Random类。需要导包:import java.util.Random;
- Random类生成随机数的方法和Scanner的方法类似,如Random.nextInt(100); 范围左闭右开,即[0,100),0~99。
【笔记四】 133-142P String字符串类
- 不需要导包。
- 字符串比较方法:str1.equals(str2); 相同返回true。**.equalsIgnoreCase()** 忽略大小写。
- 字符串长度:str1.length(); 返回字符串长度。
- 拼接字符串:str3 = str1.concat(str2); 返回值为新的字符串地址。
- 获取字符串指定位置字符:char ch = str1.charAt(1); 返回值为一个char。
- 查找子串在主串中第一次出现的位置:int a = str1.indexOf(“abc”); 返回值为第一次出现的索引位置。没有的话返回-1。
- 字符串截取方法:
str2 = str1.substring(5);//从第5号截取到末尾
str2 = str1.substring(4,7);//从4号截取到6号,左闭右开[4,7) - 字符串转为char数组:char[] chars = “hello”.toCharArray();
- 字符串转为byte数组:byte[] bytes = “hello”.getBytes();
- 替换字符串内指定内容:String str1 = “how do you do?”.replace(“o”,”*”);//h*w d* y*u d*?
- 分割字符串:String[] array1 = “aaa.bbb.ccc”.split(“\\.”);//切成aaa,bbb,ccc三个字符串
【笔记五】 143-147P static静态关键字
- 当使用static进行修饰后,被修饰的方法/变量不再属于对象,而是属于类。
- 由于不再属于对象,所以带static的方法/变量可以直接被调用。
静态方法:类名称.静态方法();
静态变量:类名称.静态变量; - 静态不能直接访问非静态,例如静态方法访问非静态变量。
- 静态方法里也不能用this。
- 对于静态变量初始化,我们可以使用静态代码块。静态代码块只在类第一次被声明时,执行一次。
- 静态内容总是优先于非静态。
【笔记六】 148-149P Arrays数组工具类
- 需要导包:import java.util.Arrays;
- 将数组变为字符串:Arrays.toString();
int[] a1 = {10,20,30};
String s1 = Arrays.toString(a1);//[10, 20, 30] - 数组排序:Arrays.sort();
int[] a1 = {20,10,30};
Arrays.sort(a1);//10,20,30 默认为升序
【笔记七】 150-151P Math数学工具类
- 不需要导包。
- 取绝对值:Math.abs(); 与C++一致,但是浮点数类型也是abs(),不是fabs()。
- 取平方根:Math.sqrt(); 与C++一致。
- 求n次方:Math.pow(a,b); 求a的b次方,与C++一致。
- 比大小:Math.max(a,b) / Math.min(a,b); a和b比大小,与C++一致。
- 向上取整:Math.ceil();
- 向下取整:Math.floor();
- 四舍五入:Math.round();
- Math包里还有常见的数学值,比如Math.PI是圆周率,Math.E是e值。
【笔记八】 171-184P 接口相关
- 接口没有静态代码块和构造方法。
- 一个类的父类只有一个,但是一个类可以同时实现多个接口。
当父类的方法与接口的默认方法冲突,优先父类。
当实现多个接口时存在默认方法冲突,需要对默认方法进行重写。
当实现多个接口时存在抽象方法冲突,只需要覆盖重写一次即可。 - 使用接口首先要定义接口类。
定义接口类的格式如:public interface 接口名称 { 接口内容 } - 使用接口需要创建接口实现类对接口进行实现。
接口实现类的格式如:public class 实现类名称 implements 接口名称 { … } - 接口中定义的变量均为常量。
常量格式如:public static final 数据类型 常量名称 = 数值; 前方三个关键词可省略。 - 接口中均为抽象方法,且实现类必须覆盖重写接口所有的抽象方法,除非实现类也是抽象类。(必须覆盖)
抽象方法格式如:public abstract 返回值类型 方法名称(参数列表); - Java8后,接口中可以定义默认方法。(可覆盖可不覆盖)
默认方法格式如:public default 返回值类型 方法名称(参数列表) { 方法体 } - Java8后,接口中可以定义静态方法。
静态方法格式如:public static 返回值类型 方法名称(参数列表) { 方法体 } - Java9后,接口中可以定义私有方法。(我的Java版本是1.8.0也就是Java8,所以不支持)
普通私有方法格式如:private 返回值类型 方法名称(参数列表) { 方法体 }
静态私有方法格式如:private static 返回值类型 方法名称(参数列表) { 方法体 }
【笔记九】 185-194P 继承与多态相关
- C++继承用冒号,Java继承用关键字extends。
- @Override检测是否重写,总体来说,Java的类继承与C++的类继承很相似。
- Java不支持多重继承,所以有super关键字,用来找父类。
- abstract为抽象关键字。抽象类/抽象方法。
- 访问成员变量的规则:
通过对象名称访问:看声明对象时对象的类型(等号左边),没有就向上找。
通过成员方法访问:看方法属于谁,就优先用谁的成员变量,没有就向上找。 - 实现多态性:父类引用指向子类对象。
多态格式:
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称(); - 根据第6条和第7条可知,多态中成员方法优先用子类的成员方法;通过对象名称访问成员变量,优先用父类的成员变量。
- “编译看左,运行看右”,即编译前把对象看为父类类型(左边),运行时成员变量看左边,成员方法看右边。
- 个人感觉,多态的存在使代码更加有逻辑性。
- 向上转型:右侧new一个子类对象,把它当父类来看待。 (无法调用子类特有方法)
- 向下转型:将父类对象,还原成为本来的子类对象。
格式:子类名称 对象名 = (子类名称)父类对象;(有点像强制类型转换) - 对象 instanceof 类名称 :如果对象属于该类,则返回true。使用这个即可根据对象类型,来进行向下转型,使用子类特有方法。
【笔记十】 215-218P Object/Objects根类
- 不需要导包。
- **Object.toString()**:转换为字符串,默认转换对象的地址值,需重写。
- **Object.equals(对象)**:比较对象是否相等,默认比较对象的地址值,需重写。
- **Objects.equals(对象1,对象2)**:第二条的equals方法存在空指针异常可能,Objects的equals方法更加完善。
【笔记十一】 219-225P 日期时间类
- Date类
- 需要导包:import java.util.Date;
- Date类的空参构造函数为获取当前日期。
- Date类的带参构造函数为传入一个long类型的毫秒值,根据毫秒值计算日期。0L为1970年1月1日0点。(中国是东八区加8个小时)
- **Date.getTime()**:将日期转换为毫秒值,返回值为long类型。
- DateFormat类
- 需要导包:import java.text.DateFormat;
- DateFomat类是一个抽象类,无法直接创建对象,可以使用其子类SimpleDateFormat(String pattern)
- SimpleDateFormat类需要导包:import java.text.SimpleDateFormat;
- SimpleDateFormat s1 = new SimpleDateFormat(“yyyy年MM月dd日 HH时mm分ss秒”); 构造函数传参按这个格式即可,字母不能变,其余可变。
- String str1 = s1.format(Date对象); 将一个Date对象转换为SimpleDateFormat对象中指定格式的字符串。
- Date date = s1.parse(“2020年01月04日 20时00分00秒”); 按照SimpleDateFormat对象的格式,转换为一个Date格式对象。
- Calendar类
- 需要导包:import java.util.Calendar;
- Calendar类为抽象类,无法直接创建对象。
- Calendar c1 = Calendar.getInstance(); 使用多态方法,获取一个Calendar的子类。等号右边方法为获取Calendar的子类。
- **Calendar.get(字段)**:返回日历指定字段的数值。例:c1.get(Calendar.YEAR);
- **Calendar.set(字段,值)**:设置日历指定字段的数值。例:c1.set(Calendar.YEAR, 2020);
- **Calendar.add(字段,值)**:使指定字段增加给定值,可以为负数。例:c1.add(Calendar.YEAR, -2);
- **Calendar.getTime()**:将Calendar类转为Date类。例:Date date = c1.getTime();
【笔记十二】 226-226P System系统类
- 不需要导包。
- System.currentTimeMillis(): 返回以毫秒为单位的当前时间,可以用来计算程序的运行时间。
- System.arraycopy(参数1,参数2,参数3,参数4,参数5): 将数组中指定的数据copy到另一个数组。
参数1 / 参数3:源数组 / 目标数组。
参数2 / 参数4:源数组中的起始位置 / 目标数组中的起始位置。
参数5:要复制的数组元素的数量。
【笔记十三】 227-229P StringBuilder字符串缓冲区类
- 不需要导包。
- 字符串缓冲区,可以提高字符串的操作效率。
- String底层为final修饰的数组,而StringBuilder底层是没有被final修饰的数组,可以改变长度。
- StringBuilder(): 无参构造函数,默认建议一个空字符串。
- StringBuilder(String str): 带参构造函数,建立一个内容为str的字符串。
- append(参数): 向对象里添加指定参数内容。返回值为”this”,故不用接收返回值。
- toString(): 将一个StringBuilder对象转为String对象,返回一个String对象,需要接收。
【笔记十四】 234-281P 容器及其相关*
详情请看我的另一篇文章:链接点我
其中介绍了Java容器及其相关内容。