从C到Java的极速过渡(挑战一天学会Java语法)

我真是受够自己不会Java了…于是我打算快速上手一些Java知识方便之后的日常学习
我学习的参考资料是 翁恺老师的课程,在 bilibili中国大学MOOC 都可以搜到,关键字是"Java 翁恺 浙江大学"
bilibili上的画质很低
C语言也是从这里学的hhh

Java起源于C&C++

学过任何一门语言,都会比较好上手Java不过好在我都学过hhh


编程环境

  • Eclipse

  • 下载
    选用镜像网站会更快

  • 解压这个文件
    在这里插入图片描述

  • 找到eclipse.exe

  • 打开即可使用


创建文件、开始code

  • 在最左边右键打开New接着选择Java Project
    从C到Java的极速过渡(挑战一天学会Java语法)_第1张图片
  • dalao们推荐JavaSE-1.8
    从C到Java的极速过渡(挑战一天学会Java语法)_第2张图片
  • 于是在最左边看到了这个
    在这里插入图片描述
  • 点开左边箭头,找到src,右键New一个Class
    从C到Java的极速过渡(挑战一天学会Java语法)_第3张图片
  • 名字大写
  • 同时勾选下面的public ststic vooid main(String[] args),之后finish

从C到Java的极速过渡(挑战一天学会Java语法)_第4张图片

  • 于是看到自动生成了一些代码
    从C到Java的极速过渡(挑战一天学会Java语法)_第5张图片
  • 接下来,我们就可以在// TODO内写代码了

补全代码的快捷键

Alt + /
会出现一些选项,提示可以将你的代码补全,至少在Eclipse上是这样
从C到Java的极速过渡(挑战一天学会Java语法)_第6张图片


输出Hello World,程序设计永远的语句

  • 程序员的浪漫
  • 在刚才的区域内输入System.out.println("Hello World")
  • 在这句话最后加上分号;
    C/C++相似的地方出现了呢~
  • ctrl + s保存代码
  • ctrl + F11运行代码
    你也可以点击左上角的这个按钮开始运行从C到Java的极速过渡(挑战一天学会Java语法)_第7张图片
  • 不出意外,你会在最下方我默认你全屏了Console区看到
    从C到Java的极速过渡(挑战一天学会Java语法)_第8张图片
  • 这里出现的表示程序已经终止了
    从C到Java的极速过渡(挑战一天学会Java语法)_第9张图片
  • (如果你成功了,那么,)恭喜!你已经知道如何敲JavaHelloWorld了!

输入、计算

输入

  • 首先,输入Scan之后Alt + /(如果你忘了的话,我提醒你一下,这是补全代码)
  • 点击Scanner - java.util,你会惊奇地发现代码除了出现Scanner,还补全了一句话
    从C到Java的极速过渡(挑战一天学会Java语法)_第10张图片
  • 接着完善这句话Scanner in = new Scanner(System.in);注意分号
  • 然后我们来输出输入的东西,使用System.out.println(in.nextLine())
  • 保存,运行,目光聚集到Console
    从C到Java的极速过渡(挑战一天学会Java语法)_第11张图片
  • 原则上来说,你只是盯着看而不动的话,它也不会有光标出现…于是我们点一下,就会出现光标
  • 接着输入一些东西,以回车结束
    从C到Java的极速过渡(挑战一天学会Java语法)_第12张图片
  • 伴随着的出现,我们成功了
  • 注意:运行后没有输出反馈时,不要多次运行,否则会出现许多一样的窗口,它们存储在这里
    从C到Java的极速过渡(挑战一天学会Java语法)_第13张图片
  • 然后你就要一个一个将它们了…反复成功hhh
  • 也可以直接关掉eclipse

字符串的连接

  • 在输出的时候我们可以写一个很长的语句,以+连接
    从C到Java的极速过渡(挑战一天学会Java语法)_第14张图片
  • 于是…
    从C到Java的极速过渡(挑战一天学会Java语法)_第15张图片

计算

  • 接下来我们输入这句话,注意括号
    从C到Java的极速过渡(挑战一天学会Java语法)_第16张图片
  • 保存,运行,于是可以看到输出
    在这里插入图片描述
  • 你可以自己体验一下不加括号会发生什么

定义变量来做加法

  • Java的变量与C一样,都需要先定义(强类型语言)

  • 输入一个int值我们使用in.nextInt

  • 我们先来做一个加法
    从C到Java的极速过渡(挑战一天学会Java语法)_第17张图片
    在这里插入图片描述

  • 如果后一个a + b不加括号
    在这里插入图片描述

  • 不出意外你会看到
    从C到Java的极速过渡(挑战一天学会Java语法)_第18张图片

  • 恢复正确程序,观察行数栏,不出意外,你会看到这个
    从C到Java的极速过渡(挑战一天学会Java语法)_第19张图片

  • 这里提示in未关闭,这种黄色警告是warning,解决方法是在输入结束之后加入一句in.close(),这里直接放到最后也ok
    从C到Java的极速过渡(挑战一天学会Java语法)_第20张图片

  • 那没别的事的话就先

浮点数

输入

从C到Java的极速过渡(挑战一天学会Java语法)_第21张图片
在这里插入图片描述

精度损失

从C到Java的极速过渡(挑战一天学会Java语法)_第22张图片
从C到Java的极速过渡(挑战一天学会Java语法)_第23张图片
从C到Java的极速过渡(挑战一天学会Java语法)_第24张图片

  • 说到这个,讲个笑话轻松一下
    从C到Java的极速过渡(挑战一天学会Java语法)_第25张图片
    原理解释-linked to 知乎

布尔类型

  • boolean
  • 返回值是true/false

与C高度重叠的内容

格式化输出

从C到Java的极速过渡(挑战一天学会Java语法)_第26张图片

类型转换

  • (type)
(int)(1.3 + 1);

注释

// 行注释
/*
	段注释
*/
  • ctrl + /行注释
  • eclipse中的段注释超好看的

选择结构

  • C
  • if - else
  • switch - case
  • 三目运算符

循环结构

  • C
  • 支持do - while
    来玩一个经典猜数游戏这个游戏也是二分算法的启蒙题目hhh
    从C到Java的极速过渡(挑战一天学会Java语法)_第27张图片
  • 可以复制下来去玩一玩
import java.util.Scanner;

public class Hello {
     

	public static void main(String[] args) {
     
		Scanner in = new Scanner(System.in);
		int number = (int)(Math.random() * 100 + 1);
		int a = 0, cnt = 0;
		do {
     
			cnt ++;
			a = in.nextInt();
			boolean flag = (a > number) ? true : false;
			if (flag) {
     
				System.out.println("猜大了");
			} else {
     
				System.out.println("猜小了");
			}
		} while (a != number);
		
		System.out.println("恭喜!你只猜了" + cnt + "次!");
		in.close();
	}

}

数组

  • 数组是一种数据类型,使用[]表示

创建

  • int[] arr = new int[101];或者直接int[] arr = {1, 2, 3, 4, };
    从C到Java的极速过渡(挑战一天学会Java语法)_第28张图片
  • length
    从C到Java的极速过渡(挑战一天学会Java语法)_第29张图片

Java中的常量

  • 使用final来限定即可
    从C到Java的极速过渡(挑战一天学会Java语法)_第30张图片
  • 注意这个例子,final修饰的东西居然是可变的!怎么回事?
    Java里数据有两种大分类,基本数据类型和对象。
    final基本数据类型不可修改,但final对象的意义是:必须得是这个对象,不能改成别的对象
    而数组是一种特殊的对象,因此可以对数组的值进行修改

复制数组(引用)

从C到Java的极速过渡(挑战一天学会Java语法)_第31张图片

  • 不过事实上,地址是一个值,也就是说现在使用的还是arr的数据,不过是访问了而已(你可以类比C++的引用)
    从C到Java的极速过渡(挑战一天学会Java语法)_第32张图片
  • 所以说这是一个不安全的行为,请不要尝试更改b这个数组!否则会同时更改arr
    从C到Java的极速过渡(挑战一天学会Java语法)_第33张图片

for_each遍历

  • for ( int i : arr ),该语句可以遍历数组中每一个元素
    从C到Java的极速过渡(挑战一天学会Java语法)_第34张图片

continue想要的循环

  • 可以理解成goto
    从C到Java的极速过渡(挑战一天学会Java语法)_第35张图片

二维数组

  • 类似与一维数组,你当然可以联想到可以以int[][] arr = new arr[3][5];的方式来创建数组
    在此略去…

字符类型

基础知识

  • 用单引号括起来一个字符
  • 单个汉字是一个字符
  • 计算采取 U n i c o d e \rm Unicode Unicode的标准,因此'\u0041'也可以表示'A'
  • 比较大小采取的也是 U n i c o d e \rm Unicode Unicode

逃逸字符

  • C重叠
  • 讲个冷知识轻松一下:'\r'回车'\n'换行,因为回车和换行本来就是不同的行为

类(Class)(I)

  • 在Java中类的首字母大写,在此之前已经见过如果你忘记了的话,我提醒你,在开始写Java,创建一个类的时候,我提醒过你要大写首字母
  • 从这里开始与C有很大的区别,我们将开始学习面向过程的程序设计

包裹类型

  • int,char,double,blloean对应Integer,Character,Double,Boolean
  • 区别在于:
  1. Integer是int的包装类,int则是java的一种基本数据类型
  2. Integer变量必须实例化后才能使用,而int变量不需要
  3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
  4. Integer的默认值是null,int的默认值是0
  • 常用的东西有:
  1. Integer.MAX_VALUE,Integer.MIN_VALUE
  2. Character.isDigit(),Character.isLowerCase(),Character.toLowerCase()

Math类

  • Math.abs()
  • Math.round()四舍五入
  • Math.random() [0,1)的数字,在此之前我们已经使用过了如果你忘记了的话,我提醒你是在do-while-猜数游戏处
  • Math.pow(a, b)
  • Math.max(a, b),Math.min(a, b)

字符串

  • 用双引号括起来一个字符串,在此之前已经用过从HelloWorld开始每个程序中都有它的身影

构造

  • String即可,注意首字母大写表示这不是基础类型,而是一个
  • 不难想到一种新的方式输出Hello world
    从C到Java的极速过渡(挑战一天学会Java语法)_第36张图片
  • 请你逐渐习惯下面带new的写法
    从C到Java的极速过渡(挑战一天学会Java语法)_第37张图片

连接

在此之前已经用过(如果…提醒…)在最早做两数加法的时候

输入

  • 读到空格就结束的in.next()
  • 读入一行的in.nextLine()还记得最早的输出你的输入那个程序吗?

比较

  • 使用类方法String.euqals()
    从C到Java的极速过渡(挑战一天学会Java语法)_第38张图片
  • 注意与下述程序做区分
    从C到Java的极速过渡(挑战一天学会Java语法)_第39张图片
  • ==判断是不是同一目标,.euqals()判断对象是否相同
    从C到Java的极速过渡(挑战一天学会Java语法)_第40张图片
  • 这样的话,我们又找到了一种解释上面笑话的方法了如果你不记得是什么笑话了,我帮你回忆一下,与知乎相关

字符串方法(字符串操作)

越是学一门现代语言,越是要看字符串操作能力

  • 字符串不能使用for_each枚举(遍历)
  • compareTo()比较字符串
    字典序
  • length()获取字符串长度
    注意是类方法,有括号,区别于数组的length操作
  • charAt(idx)
  1. 返回在idx上的单个字符
  2. idx ∈ [ 0 , l e n g t h ( ) − 1 ) \in\rm[0,length()-1) [0,length()1),小心不要越界了
  • substring(n)/substring(begin, end)
    1.获取一段字符串,如果只给一个值,会获取到结尾
    2.左闭右开 ,程序永远的约定
    3.注意下标从 0 0 0开始
  • indexOf()寻找字符
    1.输入字符,则会查找字符是否存在,存在就会返回下标,否则返回-1
    2.输入字符串,执行与 第一条 类似的操作,区别在于会返回起始位置
    3.如果输入两个值,例如a.indexOf(c, n)会从n开始寻找c字符
    4.注意下标
  • lastIndexOf()倒序寻找
  • indexOf()恰好相反
    从C到Java的极速过渡(挑战一天学会Java语法)_第41张图片
  • startsWith(),endsWith(),trim(),replace(),toLowerCase(),toUpperCase()
    由于是极速上手的教程,上述方法在此略去

重中之重:字符串的操作不会改变本身

我们以上述的toUpperCase()为例
这句话的意思是:
如果你不用对象来接收修改,那么不会影响到字符串
从C到Java的极速过渡(挑战一天学会Java语法)_第42张图片

  • 第一种手段:新的对象接收
    从C到Java的极速过渡(挑战一天学会Java语法)_第43张图片
  • 第二种:自己接收自己
    从C到Java的极速过渡(挑战一天学会Java语法)_第44张图片
  • 第三种手段:StringBuffer
    这是新的类,叫做可变字符串,请你百度自行学习相关内容

可以使用switch-case


函数(方法)

  • 简单说来,就是在C的基础上加上public static前缀即可
    从C到Java的极速过渡(挑战一天学会Java语法)_第45张图片
    这里仅供语法教学,不提供代码的优化,例如上述例子可以使用数组存储或者直接打表,这些方法我一概不讲(hhh)
  • Java中对基本类型的变量是不支持引用传递的这里是C++的知识…你可以理解为传指针
    我们需要学习有关类的知识(妈耶…怎么感觉我都会的样子…我也是Java初学者呜呜呜)
  • 其他的成分与C是重叠的了

类(Class)(II)

  • 上面我们使用了许多官方封装类,下面学习如何自己封装一个类
  • 考虑到点进来的可能都只学过C,我简单说一下 面向对象的程序设计思想

C语言中我们有一种类型叫做struct,它是我们自己封装的一种数据类型
事实上,有了数据类型,就一定能实现这种类型的函数、数据结构
通常,我们只会对这一种数据类型进行函数操作

例如我们有一个数据类型是struct Complex一个复数的结构体
我们用它来实现一些功能比如:打印一个复数出来、实现复数的实部,虚部的访问/获取、做两个复数的加减法、乘法…
这些功能都只限定在 复数 这一个 对象
不会有其他的数据类型加入,这种 " 垄断 " 恰好就是面向对象的思路了
于是,我们更希望写出一个字符串的类、一个复数的类…将方法封装起来

如果还是不理解的话,没关系,再给你一个例子
你一定写过或是听说过 学生管理系统
如果我们将其中的对于学生的操作都封装起来…也完成了面向对象的程序设计

以上就是面向对象程序设计的基本思路了!

  • 关于类与对象:
    打个比方,如果说 人是一个 ,那么 某一个人 就叫做一个 对象
  • 概括地说,类是封装数据和操作数据的方法的封装体

创建类

  • 还记得最早的操作吗?当时我们已经创建了一个叫做 Hello 的类,对吗?我们用同样的方式再创建一个吧!
  • 不出意外你应该可以看到这个界面
    从C到Java的极速过渡(挑战一天学会Java语法)_第46张图片
  • 下面我们来实现一个类,叫做 One_Class ,它可以将数加起来,并且可以反馈这个结果
    这是非常简单的功能,我们只是使用类来将其实现出来,放轻松,面向对象的程序设计不难哒
    从C到Java的极速过渡(挑战一天学会Java语法)_第47张图片
  • 在刚刚的基础上我们再增加一个对象,这样做的意义是让你理解类和对象的关系上面打了一个人类和一个人的比方,如果不理解再回去看看那个比方
    从C到Java的极速过渡(挑战一天学会Java语法)_第48张图片
  • 类与类可以嵌套,被叫做 内部类
    要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现
  • 匿名类是内部类的一种

对象数组

  • 如果数组的类型是一个对象,那么数组中存储的是对象的管理者你可以理解为数组存了一堆指针,指针指向对象
  • 对象数组中的for_each()
    从C到Java的极速过渡(挑战一天学会Java语法)_第49张图片
  • 由于学过C语言我默认你学过C语言,我们很轻易就能理解出现上述情况的原因就是改变了指针所指的内容

成员变量、成员函数

  • 函数中可以直接写成员变量的名字来访问成员变量
  • 访问的成员属于 当前 的对象
    在实现上,采用虚拟指针 this 实现
  • 我们再刚才的类中增加一个方法init()初始化,可以读取一个数值成为初始值…那么我们首先需要一个初始值:
  • 那么最终的答案就是origin + sum,我们在show()中进行修改即可
    从C到Java的极速过渡(挑战一天学会Java语法)_第50张图片
  • 成员变量与函数变量类似,有生存期和作用域
    它的生存期是对象的生成期,作用域是类内部的成员函数
    我们不需要关心对象如何销毁,Java具有自动回收机制

构造函数

  1. 如果用户没有初始化一个对象,类依然有默认的数值,这被叫做类的初始化,也叫作构造函数。
  2. 构造函数没有返回值,并且名称与类名相同。
  3. 如果你没有构造函数,那么new出的对象默认为 0 0 0
  4. 一个类中可以有多个构造函数,只要参数列表不同即可,这被叫做重载
  5. this()可以调用其他构造函数
  • 下面我们来体验一下重载
    从C到Java的极速过渡(挑战一天学会Java语法)_第51张图片

  • 接着我们将init()写成构造函数
    从C到Java的极速过渡(挑战一天学会Java语法)_第52张图片

  • 再来感受一下this()方法,它可以直接调用别的构造函数
    从C到Java的极速过渡(挑战一天学会Java语法)_第53张图片

对象的交互

  • 想要表达的其实就是,类中可以有其他类。
    举个例子,有一个类是图书馆,其中包含书架,书架中也可以包含,书中可以包含编号借阅情况价格等等…

访问属性

封闭访问属性

  • 指的是private关键字可以封闭访问属性,可以很好地保护数据在我学C++的时候dalao说过凡是数据都private就行
  • 这个封闭指的是只有该类内部可以访问,其他类和对象都不可访问

开放访问属性

  • 指的是public关键字可以开放访问属性,不过这个访问属性指的是该类中的开放,其他类不可见
  • 而如果想要更开放,我们可以将public也去掉,这样就可以实现 同一package (包)都能访问
    (这种访问特性叫做friendly)如果你如果后要学习C++,请记住这个词
  • 同样的,如果一个类权限为public,只能放在相同类名的包 (package)
  • 如果想要在当前包内放入其他类,那么这些类不能有 public 权限,而是开放于整个包

[ pass ]

  • 事实上,还有一种访问属性叫做protected,现在不涉及,我们会在后面的文字中说明,这里先跳过

包(package)

  1. 前面在说访问属性的时候,将包的作用差不多说完了
  2. 如果你想要使用其他包内的类,你需要使用import关键字或者写出全名
  • 我举个简单的例子,import的方式:
    从C到Java的极速过渡(挑战一天学会Java语法)_第54张图片
  • 把全名写出来的方式:
    从C到Java的极速过渡(挑战一天学会Java语法)_第55张图片
  • 另外的一种写法是import包内的所有东西:
import Pac.*;
  • 包可以嵌套,这也就是为什么在最早你会见到这条语句:
import java.util.Scanner;

类变量、类函数(方法)

  • 还记得刚学函数的时候我给你的简单理解吗?
  • 当时说的是:
    从C到Java的极速过渡(挑战一天学会Java语法)_第56张图片

public是懂了,那static又是什么呢?

  • C语言static叫做静态全局变量,Java中也是这样。Java起源于C不过有了更丰富的内涵。
  • 这被用做类变量的修饰。类变量是类本身的属性,在任何一个对象或者类本身中做出修改,达到 “全局修改” 的效果
  • 同样,它也可用于修饰类函数

类函数(方法)

  • static函数只能调用static函数,
  • 只能访问static成员变量
  • 不属于任何执行对象,只属于类

如果一直在这个根目录下写东西会让整体结构非常不美观,我们之后再来谈类


泛型容器

这件事情在C++中也叫作(模板)容器,C++官方甚至开发了STL
包含两个结构:

  • 容器的类型
  • 元素的类型(键值)我不知道可不可以这么叫,C++确实叫做键值

ArrayList

import java.util.ArrayList;
...
ArrayList<String> notes = new ArrayList<String>();

操作

  • size()大小
  • get()
  • remove()

HashSet

  • (哈希)集合,能自动去重
  • 来对比一下ArrayList&HashSet
    从C到Java的极速过渡(挑战一天学会Java语法)_第57张图片
  • 在任何一个Java的类中加入
public String toString() {
     
	return ...;
}

就可以直接像上面那样输出对象

哈希表HashMap

C++中叫做unordered_map>

  • to没有学过数据结构或者不熟悉的同学简单说来,哈希表可以描述两个键值的映射关系
  • 并且Hash表可以快速修改、查询内容详见数据结构,在此不做说明
  • Hash表为了避免歧义,这里不适用HashTable的说法是很常用的数据结构,它的方法(操作)可以在Java文档中找到
    从C到Java的极速过渡(挑战一天学会Java语法)_第58张图片

类(Class)(III)

  • 我们继续来学习类

类继承

  • 当两个(或更多)类的结构相似,为方便维护,我们可以使用extends关键字来修饰
    C++中的template
public class A extends Item
...
public class B extends Item
...
private ArrayList<Item> listItem = new ArrayList<Item>();
...
  • 要解决小的差异,就分开写这个函数,在父类中写默认的函数即可,会优先使用子类函数,这样就解决了小区别的问题

protected

  • 这个访问属性表示包内和子类可以访问

super关键字

如果你学过python应该也不成问题

  • super可以用来引用直接父类的实例变量。
  • super可以用来调用直接父类方法。
  • super()可以用于调用直接父类构造函数。

父类与子类的联系

  • 子类继承父类的全部内容
  • 子类不可以直接访问父类中private成员,但是可以使用父类函数访问
  • 如果出现同名成员,子类所指的是子类的,父类所指的是父类的,两者无关,出现冲突时使用super即可

多态

  • 多态是同一个行为具有多个不同表现形式或形态的能力
  • 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法
  • 成员变量:编译看左边,运行看左边指左值和右值
  • 成员方法:编译看左边,运行看右边

造型(转型)

下面是与C++很不同的地方!

  • 父类引用指向子类对象

向上转型

将子类对象转为父类对象。此处父类对象可以是接口。

Father f = new Son(); 

向下转型

将父类对象转为子类对象。

Son s = (Son)f; 

不要与基本类型的强制类型转换混淆了,对象之间的这种操作叫做转型


Object类

  • 所有类 最终 都继承自 Object
  • 其中有许多方法,你可以这样查看:
    从C到Java的极速过渡(挑战一天学会Java语法)_第59张图片

杂项

优化代码

是一个例子,详细地直接观看视频会更好一些

点击观看

善用@Override

注解的使用策略

MVC设计模式

模型层(Model)、显示层(View)、控制层(Controller)

抽象类abstract

抽象

接口

  • implements
  • 接口不能继承类
    接口

异常捕捉

try-catch

  • 异常是一种程序控制机制,与函数机制独立和互补
    同C++
  • 异常是很重要的属性,请你自行百度进行学习

笔者写至此处已经半夜…没有动力再去复习学过的知识了…现在想快速完成挑战

  • 流是很重要的内容,请你自行百度进行学习
  • stream这个概念与C++类似,在此略去
  • 不过要注意bufferedReader这个方法…可以快速读入竞赛使用
  • 还要注意一下文件流同样的原因,在此不做细讲

串行化

串行化

--------THE END--------

E O F EOF EOF
>>挑战成功:一天学完Java语法

从C到Java的极速过渡(挑战一天学会Java语法)_第60张图片

  • 人生记录:从21/2/24/13:00到21/2/25/0:51,我将Java学习完毕

后期还会更新Java的使用技巧我有一本巨厚的Java书…不过一直都没看…因为…最近快开学了!!…呜呜呜

你可能感兴趣的:(TKLA,java,编程语言)