Java入门到精通
Java入门–数组,字符串,包裹体,函数(作用域与生存期)
. 的运算 调用库函数
UML图,继承,关联
Hello!我是C风,专注于算法以及Java的学习,我有两个专栏,Java专栏专门记录我的Java学习从零起步的过程。今天是我正式开始发博客打卡Java学习,之前一直是只懂基本的C,现在转战Java,从最基本的开始学起,以博客来记录我的学习笔记以及学习心得。
这里关于二维数组我就最后在做一道题目,以此来结束我的二维数组的学习,我们知道二维数组变量也只是一个管理者,要真正的复制必须借助循环,这里还有一点就是我们的长度是可以控制的,比如我要cnt大小的数组,直接num[cnt]就好了,这与C语言是不一样的,但是我们在无法知道其大小的时候也只能按照C语言里面尽可能大,这里我们就以一道二维数组题目结束吧:
题目描述:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
题目输入:
6 3 5 3 3 12 1 6 0 20 6 2 5 3 2 12 1 6 0 20
题目输出:
5x6 + 6x5 + 12x3 + 12x2 + 12x1 + 12x + 40
这其实就是我们之前做的链表那个多项式的加法,这里我们还是按照一样的方法,只是这里我们使用的容器是二维数组,这里创建一个2列的二维数组就好了;操作就是要进行两数组元素之间的比较,这里我们使用while循环,代码还有点问题,但是主要是为了说明情况,就不再修改,while后面还要有多出来的部分的连接,但是我们这里因为循环了很多次,就没有写,实际上不应该循环这么多次,这里的效率有点低 ,我们使用code数组来复制我们的数据:
public class Main {//习惯上要将首字母大写
public static void main(String[] args) {
Scanner in = new Scanner(System .in);
int[][] arr = new int[10][2];
int[][] brr = new int[10][2];
int[][] code = new int[20][2];//自动初始化
int i = 0;
do {
arr[i][0] = in.nextInt();
arr[i][1] = in.nextInt();
i++;
}while(arr[i -1][0] != 0);
i = 0;
do {
brr[i][0] = in.nextInt();
brr[i][1] = in.nextInt();
i++;
}while(brr[i - 1][0] != 0);
int j =0,k = 0;
i = 0;
while(j < arr.length && k < brr.length)
{
if(arr[j][0] > brr[k][0])
{
code[i][0] = arr[j][0];
code[i][1] = arr[j][1];
j++;
i++;
}
else if(arr[j][0] < brr[k][0])
{
code[i][0] = brr[k][0];
code[i][1] = brr[k][1];
k++;
i++;
}
else {
code[i][0] = arr[j][0];
code[i][1] = arr[j][1] + brr[k][1];
i++;
j++;
k++;
}
}
for(int l = 0;l < code.length;l++)
{
if(code[l][0] != 0 && code[l][1] != 0)
{
System.out.print(code[l][1]+"x"+ code[l][0] + " + ");
}
if(code[l][0] == 1 && code[l][1] != 0)
{
System.out.print(code[l][1] + "x + ");
}
if(code[l][0] == 0 && code[l][1] != 0)
{
System.out.println(code[l][1]);
}
}
}
}
// 6 3 5 3 3 12 1 6 0 20 6 2 5 3 2 12 1 6 0 20
代码实现就是这样子,我们接下来学习的是函数,主要是看与C语言有什么不同
Java采用的不是Ascall码,而是Unicode码,这是需要记住的;一个字符的常量是用单引号包围起来的一个字符,如’a’、’*’、‘好’。一个汉字也是Unicode的一个字符,所以也是Java的一个字符。汉字就是字符;
char c = 'A';
c++;
之后得到的是B,这里面也可以是一个字,++之后就是下一个位置的字符,在unicode里0 到9是在以前,小写字母都是一起,大写字母都是在一起,我们可以直接,char c = 65,这样就会直接得到字符,所以可以比较大小,汉字比所有的西文字符都要大一些
逃逸字符;就是我们C语言里面的逃逸字符,如\t \n \b之类的,我们可以在虚拟机上运行得到具体结果
每一个基础类型都对应一个包裹类型
首先就是包裹类型可以像普通的数据类型那样使用,比如我们定义Integer i = 10;与int i = 10 没有区别,而且还可以相互赋值;它的特殊作用就是可以获得该类型的最大最小值
System.out.print(Integer.MAX_VALUE);//Integer.MIN_VALUE
//这样就直接获取到最大值为2的31次方- 1,最小值就是2的32次方负了
当我们需要让一个对象或者类做事情的时候,就用.运算符;比如.out 和Integer.MAX_VALUE 以及num.lenth之类的
包裹体结合.就可以做很多事情,比如Character.IsDight(’-’)判断是否是数字;Character.isLowerCase(‘a’)判断是否是小写;总之之后就是有很多功能;可以帮助我们做很多事情,比如我们要转换大小写,直接Character.toLowerCase(’’)就可以了,善用包裹类型可以节省很多时间,善用.运算符也是;
这下面有random,abs,round,pow之类的运算,我们之前见识过random,我们看看其余的
System.out.print(Math.abs(-12)); //打印12
System.out.print(Math.round(10.23));//四舍五入的,就是得到10,对第一位小数
System.out.print(Math.pow(2,2.4));//得到的是2的2.4次方
学过C就知道,字符串其实就是一个数组,只是所放的数据类型不一样,这里我们定义字符串使用的是String;这样定义的字符串变量和数组变量一样,它们只是数组的管理者或者字符串的管理者;不是所有者;这里注意Sting的第一个字母是大写的,(包裹体也是),这说明它不是一个基础的变量,而是一个类
String s = new String("a String");//创建了字符串之后交给s来进行管理
字符串的连接就是+;这之前就是一样的;它会把另一边直接转换成字符串,还有就是print与println的区别在于println会打印所有,而print只能打印第一个位置,这就是我们以前C会出现的问题,所以当时加了一个getchar,这里换成println就好了
String s;
// System.out.print(12+24);//两边都不是字符串,普通的加号处理
// System.out.print("12"+24);//一边是字符串,自动将24转换成字符串
// System.out.print(s+12+24);//不会算加法,从左到右,第一个就是字符串,之后也变成字符串了,就还是当字符串处理
// s = in.next();// 得到 hi,I
s= in.nextLine();//得到 hi,I like it
System.out.print(s);
总的来说,虽然Java里面的数组之类的变量可以赋值,但是并没有多大的意义,只是给一个管理权,并没有新开辟空间,所以比较字符串相等,还是用的.运算符里的.equals();
用== 就是没有意义的,这样要是true只能是两个字符串变量管理同一个字符串,这显然是不合适的,因为只要两字符串内容意义就应该是相等的了;也就是说用 equals是比较它们的内容是否相同 ,== 是比较他们是不是同一个东西;
System.out.println(s.equals("bye"));//比较是否与bye相等
字符串是一个对象,按照我们上面的说法,我们对它进行操作是用的**. 代表对其左边的字符串进行操作**,字符串既可以是变量,也可以是常量
System.out.print(s1.compareTo(s2));
还有很多操作,比如说s.lenth(); s.charAt(index);(字符在?)所以直接看翻译了,返回的是在index位置上的字符,范围是0 – lenth() - 1;s.subString(pos1,pos2)是获得字串,还有诸如indexof获得某个字符的位置,可以加个开始寻找的位置之类的,我们使用的时候就会去发现哪个合适,还有很多很多函数,我们都可以直接拿来使用,比C方便很多,所以Java应用广泛,但是C可以让我们知道怎么来的,就是需要写更多东西,这里需要注意一点就是像toUpperCase之类的函数并不会改变String本身,他们是以String为出发点构造一个新的字符串,所以我们要得到修改结果就该i用另一个字符串变量去接收,或者我们把其放在print里面输出
Java里面的函数定义与C语言里面基本差不多,函数就是一块代码,有了函数就可以避免我们的代码复制,函数的类型有多种,诸如Boolean,int,void之类,函数的参数可以有一个也可以有多个。我们习惯性要加上static来定义我们的函数
函数名,函数头,函数体
public static void Sum(int a,int b); //不需要返回值public static boolean IsPrime(int num);//需要返回值true或者false
其余的都还是差不多的,这里我们的Java里面最外层是有一个大的Main类,把整个程序都封装起来的,里面的main小的就是我们C里面的那种mian函数。还有就是我们进行参数传递时,可以输入比需要的窄的数据,比如需要int,我们输入double语句,这是可以的,比如需要int,我们给的char型,这也是可以的,但是反过来就不行,因为窄宽不一样
还有就是我们传递的是形式参数,这与C是一样的,这里就是函数所使用的是另外的空间,就是函数调用栈,这里我们main,sum之类的函数都有他们自己的空间;函数的每次调用的空间都是不一样的,函数中独有的变量叫做本地变量;
变量的生存期与作用域:生存期—变量什么时候开始出现,什么时候消亡;作用域—在什么范围内它可以起作用,(可以访问),对于本地变量,生存期于作用域是一样的;但是对于class之类的就不一定了,大括号里面—块;Java里面的函数按照面向对象编程就是方法,而函数变得数据类型之类的就是类的属性;然后属性与方法封装在一个类里面;
常用Windows快捷键,dos介绍
Java跨平台原理,接触面向对象编程
诸如Ctrl + V ;+C ;+A;+X,+T之类就不用多说了,需要介绍的下面几个Windows的:
Windows + E 打开我的电脑
Windows + D 回到桌面
Windows + L 锁屏
Windows + R 打开运行窗口 //这个很有用
什么是DOS,就是哪个黑窗口,书面语就是磁盘操作系统,黑窗口就是命令窗口
使用Windows + R + cmd就可以打开Windows的DOS窗口
Windows + X +A +回车也可以(就是那个WindowsPowerShel(管理员A))打开之后窗口时蓝色的 ,常见的操作就网上有
这是指Java写的程序是可以在任何平台(操作系统)上面运行的,这是因为又Java虚拟机,对应不同的系统有不同的Java虚拟机,虚拟机起到的是翻译的作用,这才是其跨平台的原因。Java虚拟机本身是不可以跨平台的,只是有不同的版本,这就是JVM;
概括就是:编译一次,到处运行!
JDK就是我们的Java的开发环境,里面包含JRE和开发工具包,就像我们的eclipse; JRE就是Java的运行环境,包含Java虚拟机以及Java的类库,我们使用的就是JRE-16 ;JVM就是Java虚拟机了
C语言就是面向过程,它也有局部封装性,比如说我们的每一个方法;但是很大的一部分都没有封装好,比如说全局变量,所有函数都可以访问,就会非常的混乱,一旦修改,就会非常的麻烦,面向对象就是加大封装的力度,我们将若干个方法与属性封装到一起形成一个对象,对象之间可以实现信息的交互,这样结构就非常清晰,提升复用度,修改性更强
面向对象编程是以对象为主,而面向过程如C就是以函数为主,想的都是如何实现我们的功能;面向对象可以更加容易从需求中过来,产生一个设计方案;我们可以把需求中所有的名词或者名词短语类化为对象
需求:银行业务员需要一个顾客的信息(包括姓名和身份证号等)和他拥有的账户的信息(包括密码和余额等),以便确定顾客是否有支取一定金额的权利
用面向对象的技术,对于问题域中名词域名词短语如出现的顾客 和 账户都可视为对象,它们之间进行信息的交互
将数据以及对数据的操作(方法)放在一起,作为一个不可分的整体,即是软件对象;
需求问题域中具有属性的实体与概念都可以叫对象,所谓属性就是名词对象的子名词,就是它的特点之类的,就是我们描述该对象所需要的东西(就像银行账户对象)那我们描述这个对象就要它余额,密码之类的,方法就可以有修改密码呀 比如一个⚪就是对象,它的属性就有圆心位置,圆的半径大小之类的,对其的操作(方法)就有旋转之类的;一个二维点对象的属性就有横纵坐标
将对象归类,就形成了类,这里类就像对象一个模板;
举个例子:刚刚我们说⚪是一个对象,那么将⚪抽象之后呢,这就形成了一个类,叫做Circle ;这里我们就可以定义多个对象,比如 Circle a;Circle b;这样就有两个⚪对象了;
这个感觉就像我们以前C里面的结构体一样,所有的Student就是一个类,定义的时候就直接使用的Student stu[100];就有100个对象了;所以二者的区别还是有点大的;
UML ( Unified Modeling Languge)统一建模语言,是用来设计软件蓝图的可视化建模语言;Class diagrams 类图的设计是面向对象编程设计阶段第一个关键的步骤
类图的设计就是有三个部分:类名,类属性,类方法(属性前面带一个小减号,方法前面带一个小加号)这里我们就举例了一个类图
类方法在表示方法时与C语言有点不同,在参数列表时每一个参数后面加冒号写参数的类型;方法名的命名再说一次,就是我们的第一个单词首字母小写,后面的每一个单词首字母都要大写;
我们之前的小加号表示什么?这是表示的访问权限
这个就是对于方法的访问的操作时会遇到
一般的类图都要体现继承关系,如果两个类有继承关系,一个类自动拥有另一个类的所有数据与操作;被继承的类叫做父类或者超类,继承父类所有操作与数据的叫做子类; 子类可以在继承的基础上进行拓展,添加自己的新的操作,子类也可以复写父类的操作,使其操作行为有别于父类,子类与父类就是Specialization 与 Generalization 特殊与一般化,就像我们举例为顾客 与 集购顾客就是父类与子类,继承就会得到一个好处就是多态,其实一想就知道大概是什么意思
继承关系我们绘制UML图时要使用空心的箭头
我们知道之前的继承关系就是is-a的关系,这里关联关系就是one-way ,Client 顾客 与 Bankcount 账户之间就是有一个,关联关系有三要素关联的方向,关联的数量以及关联发生的那个(属性)变量,像这里Bankcount就与Client关联,也就是关联的属性,它关联的Bankcount 是另一个类的名称,我们一般就是使用 .运算符来实现调用,这里的类之间的关系就是course就是其下面的属性,关联的就是这个属性
这里我们来举个例子:就是Goverment Country 和 capital的关联,我们在这里化一个类图
这里关联的就是单数,一个国家一个首都,一个政府,这就是关联的数量,初次之外还可以关联多个数量,比如一个学生关联6门课,这里每个课
这里关联的属性是单数,关联的属性的数据结构就是写在旁边的类的类型
public class Country{
···//注意private与static的区别
private Goverment goverment;//前面的Goverment就是类,后面的就是定义了一个对象
private Capital capital;//就和我们的String一样,String是一个类,.运算就可以调这个类里面的方法
···
}
关联的数量是复数时,关联属性的数据类型就是容器或者数组类型的;而容器中每一个数据的数据类型就是这个类的类型,这个也是挺好理解的,就想一下String就好了
这个有个经验就是在需求域中找两个对象之间的词如for ,of,has之类的词语;
这个找关联关系的具体案例以及完整的将一个需求转化为UML图,我们就下次再学习,今天的学习就到这里结束~