大家好,又见面了,我是你们的朋友全栈君。
基础(Basics)
打开CMD的方式:
1.开始 系统+命令提示符
2.Win键 R 输入cmd打开控制台(推荐使用)
3.在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口
4.资源管理器的地址栏前面加上cmd 一个空格 路径
常用的Dos命令
代码语言:javascript复制#盘符切换 D: 冒号需用英文模式
#查看当前目录下的所有文件 dir
#切换目录 cd change directory
cd .. 返回上级目录
#清理屏幕 cls (clear screen)
#退出终端 exit
#查看电脑的ip ipconfig
#打开应用
calc
mspaint
notepad
#ping 命令
ping www.baidu.com
#文件操作
md 目录名
rd 目录名
cd 文件名
del 文件名
摩尔定律
Intel公司的创始人之一 戈登·摩尔
当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。换言之,每一美元能买到的电脑性能,将每隔18个月翻两倍以上。但当前时代以达到摩尔定律的瓶颈。
Java三大版本
Write Once、Run Anywhere
JavaSE:标准版(桌面程序、控制台开发。。。)
JavaME:嵌入式开发(手机、小家电。。。)
JavaEE:企业级开发(web端、服务器开发。。。)
JDK、JRE、JVM
JDK:Java Development Kit
JRE:Java Runtime Environment
JVM:Java Virtual Machine
见jdk参考文档
卸载JDK
1、删除Java的安装目录
2、删除JAVA_HOME
3、删除path下关于Java的目录
4、java -version
安装JDK
1、百度搜索JDK8,找到下载地址
2、同意协议
3、下载电脑对应的版本
4、双击安装JDK
5、记住安装目录
6、配置环境变量
1、我的电脑——>右键——>属性
2、环境变量——>JAVA_HOME
3、配置path变量
7、测试JDK是否安装成功
1、打开cmd 2、java -version
Hello world
1、随便建一个文件夹,存放代码
2、新建一个Java文件
- 文件后缀名为
.java
- Hello.java
- 【注意】系统可能没有显示文件后缀名,我们需要手动打开
public class Hello{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
4、编译javac java文件、会生成一个class文件
5、运行class文件
可能遇到的问题
- 每个单词大小写不能出现问题,Java是大小写敏感的
- 尽量使用英语
- 文件名 和 类名必须保证一致,且首字母大写
- 符号使用了中文类型的
Java运行机制
编译型 和 解释型:
故事:一个中国人写了一部小说,一个外国人想读内容,如果现在有两种方式:
方式1:有一个翻译软件,把这本书从中文全部翻译成外语。 方式2:这个外国人请了一个会翻译汉语的翻译官,翻译官看一句汉语,同时翻译一句英语。
此时这两种方式各自有各自的优缺点:
对于方式1:一次完成,速度快.但是如果这个中国人在写完书后,突然更改了小说中的一些内- 容,此时需要从新开始翻译。 对于方式2:速度慢,但是如果小说内容有所改变,可以变改变一变翻译.
第一种方式就是编译型;常见C,C 第二种方式就是解释型;常见Python java语言:编译型和解释型的结合
源程序(.java文件)——>Java编译器——>字节码(.class文件)——>类装载器——>字节码校验器——>解释器——>操作系统平台
什么是字节
位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数。
字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示
1B(byte,字节)=8bit(位)
字符:是指计算机中使用的字母、数字、字和符号
1bit表示一位
1Byte表示一字节
1024B=1KB
1024KB=1M
变量命名规范
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则:monthSalary,除了第一个单词外,后面的单词首字母大写
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线MAX_VALUE
类名:首字母大写和驼峰原则:Man,GoodMan
方法名:首字母小写和驼峰原则:run(),runRun()
JavaDoc生成文档
在代码所在文件夹下,打开运行框,输入javadoc -encoding UTF-8 -charset UTF-8 文件名.java
Java流程控制
Scanner对象
一个工具类,可以获取用户的输入。java.util.Scanner是Java5的新特征。
基本语法:
代码语言:javascript复制Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
hasNext() 与 hasNextLine()的区别
next():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
- 只有输入有效字符后才将其后面的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
nextLine():
- 以Enter为结束符也就是说nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
反编译(查看class文件)
在文件夹里操作,将.class文件拖到装有.java文件的文件夹中然后用idea查看
while 和 do while 的区别
while先判断后执行,do…while是先执行后判断
Do…while总是保证循环体会被至少执行一次
For循环
- for循环语句是支持迭代的一种通用语句,是最有效、最灵活的循环结构
- for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化;布尔表达式;更新) {
//代码语句
}
快速输入
代码语言:javascript复制for (int i = 0; i <= 100; i ) {
}
100.for
break continue
break:在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
continue:在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
关于goto关键字
- goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子——带标签的break和continue。
- “标签”是指后面跟一个冒号的标识符,例如:label:
- 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
Java方法(Methods)
- Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
设计方法的原则
方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
方法的定义
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
- 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型︰方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
- 方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
Java是值传递
方法的重载
重载就是在一个类中,有相同的函数名,但形参不同的函数。
方法重载的规则:
- 方法名称必须相同。
- 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数(不定项参数)
- 在方法声明中,在指定参数类型后加一个省略号“…”
- 一个方法中只能指定一个可变参数,它必须是方法的人最后一个参数。任何普通的参数必须在它之前声明。
递归
- 递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合
递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
Java数组(Array)
Java内存分析
堆: 1.存放new的对象和数组; 2.可以被所有的线程共享,不会存放别的对象引用
栈: 1.存放基本变量类型(会包含这个基本类型的具体数值); 2.引用对象的变量(会存放这个引用在堆里面的具体地址)
方法区: 1.可以被所有线程共享; 2.包含了所有的class和static变量
三种初始化
静态初始化:
代码语言:javascript复制int[] a = {
1,2,3};
Man[] mans = {
new Man(1,1),new Man(2,2)};
动态初始化:
代码语言:javascript复制int[] a = new int[2];
a[0]=1;
a[1]=2;
数组默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
数组的四个基本特征
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
数组的使用
- 普通的For循环
- For-Each循环
- 数组作方法入参
- 叔祖作返回值
二维数组
代码语言:javascript复制int a[][] = new int[2][5];
以上二维数组a可以看成一个二行五列的数组
Arrays类
- 数组的工具类java.util.Arrays
- 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
- 查看JDK帮助文档
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而”不用”使用对象来调用(注意:是”不用”而不是“不能”)
具有以下常用功能:
- 给数组赋值:通过fill方法。
- 对数组排序:通过sort方法,按升序。
- 比较数组:通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
冒泡排序
冒泡排序是最为出名的算法之一,总共有八大排序
- 比较数组中的两个相邻的元素,如果第一个数比第二个数大,就交换他们的位置
- 每一次比较,都会产生一个最大,或者最小的数字
- 下一轮则可以少一次排序
- 依次循环直,到结束!
稀疏数组
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式是:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
面向对象
什么是面向对象(OOP)
以类的方式组织代码,以对象的形式封装数据
构造器
特点:
- 和类名相同
- 没有返回值
作用:
- new 本质在调用构造方法
- 初始化对象的值
注意点:
定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
Alt Insert 生成构造器
this.name = name;
.name(或.其他)是代表当前类的 ; 等于后面的一般是参数传进来的值
小结
- 类与对象 类是一个模板:抽象,对象是一个具体的实例
- 方法 定义,调用!
- 对象的引用 引用类型:基本类型(8) 对象是通过引用来操作的:栈——>堆(位置)
- 属性:字段Field 成员变量 默认初始化: 数字:0 0.0 char:u0000 boolean:false 引用:null 修饰符 属性类型 属性名 = 属性值
- 对象的创建和使用 1.必须使用new 关键字创造对象,构造器 Person kuangshen = new Person(); 2.对象的属性 kuangshen.name 3.对象的方法 kuangshen.sleep()
- 类: 静态的属性 属性 动态的方法 方法
封装
- 该露的露,该藏的藏 我们程序设计要追求“高内聚,低耦合”。高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
- 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
- 记住这句话就够了:属性私有,get/set
Alt Insert自动生成get和set方法
作用
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
继承
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- extands的意思是“扩展”。子类是父类的扩展。
- JAVA中类只有单继承,没有多继承!(eg.一个儿子只能有一个爸爸,一个爸爸可能有多个儿子)
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有”is a”的关系.
- object类
- super 父类
- 方法重写——>多态
私有的东西无法被继承!
多态
- 动态编译:类型:可扩展性
- 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态的存在条件:
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
注意:多态是方法的多态,属性没有多态性
(instanceof) 类型转换 引用类型
多态注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常! ClassCastException!
- 存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new Son();
不能重写的方法:
- static 方法,属性类,它不属于实例
- final 常量
- private 方法
instanceof和类型转换
判断一个对象是什么类型
总结
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转换
- 方便方法的调用,减少重复的代码!简洁
抽象:封装、继承、多态! 抽象类,接口
static关键字详解
非静态方法可以直接访问类中的静态方法,静态方法不能调用普通的方法
抽象类
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
接口
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有!
- 接口:只有规范!自己无法写方法专业的约束!约束和实现分离:面向接口编程
接口就是规范,定义的是一组规则,体现了现实世界中”如果你是。。。则必须能。。。“的思想。如果你是天使,则必须能飞,如果你是汽车,则必须能跑。
接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
面向对象的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模型都只针对具备了抽象能力的语言(比如c 、java、c#等),这就是因为设计模型所研究的,实际上就是如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface!
内部类
内部类就是一个类在内部再定义一个类,比如,A类中定义一个B类,那么,B类相对A类来说就称为内部类,而A类相对B类来说就是外部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
异常机制
Error和Exception
什么是异常?
- 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了等等。
- 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。
- 异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
- 异常发生在程序运行期间,它影响了正常的程序执行流程。
三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略
- 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误ERROR:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
异常体系结构
- Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
- 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
Error
- Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
- Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
Exception
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
- ArraylndexOutOfBoundsException(数组下标越界)
- NullPointerException(空指针异常)
- ArithmeticException(算数异常)
- MissingResourceException(丢失资源)
- ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
Error和Exception的区别:
Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
捕获和抛出异常
异常处理五个关键字:
try、catch、finally、throw、throws
自定义异常
- 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需要继承Exception类即可。
- 在程序中使用自定义异常类,大体可分为以下几个步骤:
- 创建自定义异常类
- 在方法中用过throw关键字抛出异常对象
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
- 在出现异常方法的调用者中捕获并处理异常
实际应用中的经验总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源IO~ Scanner~
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156724.html原文链接:https://javaforall.cn