-
Markdown学习(方便写笔记记录,推荐文本编辑器Typora),文件后缀xxx.md
-
标题:# 一级标题,## 二级标题,最多六级标题
-
字体:**粗体**,*斜体*,***斜体加粗***,~~删除线~~
-
引用:>引用效果
-
分割线:---分割线,***分割线
-
图片:![图片](本地或网络图片路径)
-
超链接:[点击跳转到xxx](链接地址),markdown中不支持跳转,网站是支持的
-
列表:1, 有序列表,- 无序列表
-
表格:右键插入表格或者:|列名1|列名2|列名3|\n|--|--|--|\n|列1|列2|列3|
-
代码:···Java,···Python等
-
计算机基础
-
Computer hardware= CPU+Motherboard主板+Memory内存+硬盘+显卡+IO设备键盘、鼠标、显示器
冯·诺伊曼体系结构
-
Computer software是使计算机按照事先预定好的顺序完成特定的功能,包括系统软件(DOS—DiskOperatingSystem、Windows、Linux、Unix、Mac、Android,iOS)和应用软件(wps,wechat)
-
计算机语言发展:二进制语言-汇编语言-高级语言(C/C++/Java/C#/Python/PHP/JavaScript)
-
Java入门(使用IDEA开发)
-
Java的特性和优势:简单性、面向对象、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性
-
Java三大版本:JavaSE(标准版:桌面程序、控制台开发),JavaME(嵌入式开发:手机、小家电),JavaEE(E企业级开发:web端,服务器开发)
-
JDK:Java Development Kit
JRE:Java Runtime Environment
JVM:Java Virtual Machine
-
Java基础
-
注释://单行注释,/*多行注释*/,/**文档注释*/,注意规范
-
Java标识符:
-
所有标识符都应该以字母(A-Z或者a-z),美元符($)或者下划线(_)开始
-
首字符之后可以是字母(A-Z或者a-z),美元符($),下划线(_)或数字的任何字符组合
-
不能使用关键字作为变量名或方法名
-
标识符是大小写敏感的
-
不建议使用中文或拼音命名
-
Java关键字
Java关键字
-
数据类型:强类型语言,所有变量都必须先定义后才能使用,安全性高而速度略差
基本类型:数值类型,boolean类型
-
数值:大写Byte,Integer对应一个类
整数类型:byte占1个字节范围-128~127
short占2个字节范围
int占4个字节范围
long占8个字节范围
浮点类型:float占4个字节
double占8个字节
字符类型:char占2个字节
-
boolean类型:占1位,值为true或false
引用数据类型:类、接口、数组
-
数据单位:bit-Byte(B)-KB-MB-GB-TB,1024
-
类型转换:低----高,避免内存溢出
byte,short,char->int->long->float->double
运算中,不同类型的数据先转化为同一类型,然后进行运算
-
强制类型转换 (类型)变量名 高->低
-
自动类型转换 低->高
-
注意点:不能对布尔值进行转换;不能把对象类型转换为不相干的类型,再把高容量转换到低容量的时候,强制转换;转换的时候可能存在内存溢出或者精度问题
-
变量:每个变量都必须声明其类型,变量的要素包括变量名、变量类型和作用域
type varname [=value][{,varname[=value]}]
数据类型 变量名 =值;可以用逗号隔开来声明多个同类型变量
-
变量作用域:类变量static,实例变量(类内,方法外),局部变量(方法内部)
局部变量必须声明和初始化
实例变量从属于对象;如果不自行初始化,则默认为这个类型的默认值 0,0.0,false,null,u0000,除了基本类型,其余的默认值都是null
类变量从属于类在实例变量的基础上加static
-
常量:初始化后不再改变值,常量名一般使用大写字符
final 常量名 = 值
final double PI = 3.14
-
命名规范:
-
所有变量、方法、类名:见名知意
-
类名:首字母大写和驼峰原则,Man,GoodMan
-
类成员变量和局部变量:首字母小写和驼峰原则:monthSalary
-
方法名:首字母小写和驼峰原则:run(),runRun()
-
常量:大写字母和下划线:MAX_VALUE
-
基本运算符:优先级使用()
-
包机制:用于区别类名的命名空间。一般利用公司域名倒置作为包名。import引用
Javadoc 命令使用来生成自己的API文档的:
用命令行生成包说明文档:
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
在文件夹下点击index.html查看生成结果
-
Java流程控制
-
用户交互Scanner对象:java.util.Scanner
-
next( ):读取到有效字符后才可以结束输入;对输入有效字符之前遇到的空白,next()会自动将其去掉;只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符;next()不能得到带有空格的字符串
-
nextLine( ):以Enter为结束符,也就是说nextLine( )返回的时输入回车之前的左右字符;可以获得空白
-
顺序结构:从上到下
-
选择结构:
-
if单选择结构:if(){}
-
if双选择结构:if(){}else{}
-
if多选择结果:if(){}else if(){}else if(){}else{}
-
嵌套的if结构:if(){if(){}}
-
switch多选结构:Java7以后的版本支持字符串比较。
case穿透现象:如果不写break则后面的case语句都会执行。
-
循环结构
-
while循环:while(){},先判断后执行
-
do...while循环:即使不满足条件也至少执行一次do{}while(),先执行后判断
-
for循环:for(初始化;布尔表达式;更新){},高效写法(100.for,fori),死循环for(;;){}
-
增强for循环:主要用于数组和集合for(声明语句:表达式){}
-
break,continue,goto
break:强制跳出循环
continue:跳出此次循环后去执行下一次
goto:是java的保留字,但在语言中不正式使用
-
Java方法
-
类、对象、方法。实参、形参。
-
设计方法的原则:一个方法只完成一个功能便于后续扩展。
-
方法包括修饰符,返回值类型,方法名,参数类型,方法体
-
值传递(Java)和引用传递
-
方法的重载:在一个类中,有相同的函数名称,但形参不同的函数
-
方法重载的规则:方法名称必须相同,参数列表必须不同(个数不同,或类型不同、参数排雷顺序不同等),方法的返回类型可以相同也可以不同,仅仅返回类型不同不足以成为方法的重载。
-
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,一选择对应的方法,如果匹配失败,则编译器报错。
-
命令行传参:当需要在运行一个程序的时候再传递给他消息,就要靠命令行参数给main()函数实现
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args["+i+"]"+args[i]);
}
}
-
可变参数:不定项参数,在指定参数类型后加一个省略号如(double...numbers)。一个方法中只能指定一个可变参数,他必须是方法的最后一个参数,任何普通的参数必须在它之前声明。
-
递归:方法调用自己。减少代码量,用有限的语句来定义对象的无限集合。栈机制。eg:阶乘
-
递归头:即什么时候不调用自身方法,如果没有头,将陷入死循环
-
递归体:什么时候需要调用自身方法。
-
数组:相同类型数据的有序集合
-
声明:int[] nums,创建:int[] nums = new int[10]
获取数组长度:arrays.length
-
内存分析:
-
堆:存放new的对象和数组
-
栈:存放基本变量类型
-
方法区
-
数组的特点:
-
其长度是确定的,数组一旦被创建,它的长度就是不可以改变的
-
其元素必须是相同类型,不允许出现混合类型
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型
-
数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
-
数组本身就是对象,Java中对象是在栈中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
-
数组的使用
-
for-each循环获取数组元素
-
数组作方法入参
-
数组作返回值
-
二维数组,int[][]
-
Arrays类:java.util.Arrays包含许多静态方法,可直接使用类名进行调用,而不用使用对象来调用。如下可查询java方法的说明文档:
-
给数组赋值:通过fill方法
-
对数组排序:sort方法,按升序
-
比较数组:equals比较是否相等
-
查找数组元素:binarySearch可以对排序号的数组进行二分查找法操作
-
冒泡排序:复杂度O(n^2),共有八大排序算法
-
稀疏数组:数组中大部分元素为0时使用稀疏数组保存
处理方式是:记录数组一共有几行几列,有多少个不同的值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
面向对象编程(Object-Oriented Programming ,OOP)
-
面向过程/面向对象:对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是,具体到微观操作,仍然需要面向过程的思路去处理。
-
面向对象编程的本质就是:以类的方式组织代码,以对象组织(封装)数据。
-
其三大特性为:封装、继承、多态。
-
从代码运行角度考虑是先有类后有对象。对象是具体的实例,类是对对象的抽象模板。
-
静态方法与类一起加载,非静态方法在类实例化后才存在。静态方法不能调用非静态方法。
-
形参和实参,值传递和引用传递,this关键字。
-
构造器constructor:一个类即使什么都不写,也会存在一个方法,即构造方法。必须和类的名称相同,并且没有返回值。一旦定义了有参构造,无参构造就必须显式定义。new本质在调用构造方法。
-
封装:数据的隐藏,通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
-
“高内聚、低耦合”:类的内部数据操作细节自己完成,不允许外部干涉,金宝路莎奥里昂的方法给外部使用。
-
属性私有,get/set方法一般不重载
-
提高程序的安全性,保护数据;隐藏代码的实现细节 ,统一接口;提高系统的可维护性
-
继承:对某一批类的抽象,实现对现实世界更好的建模
-
类与类之间的一种关系:继承、依赖、组合、聚合
-
extends:扩展,子类/派生类 是父类/基类的扩展
-
属性类别:public>protected>default>private
-
所有的类都直接或间接地继承object类
-
super
-
调用父类的构造器super();必须在子类构造器的第一行,默认调用父类的无参构造器
-
super必须只能出现在子类的方法或者构造方法中
-
super和this不能同时调用构造方法
-
与this相比:
-
代表的对象不同:this:本身调用者这个对象,super:代表父类对象的引用
-
前提:this没有继承也能使用,super智能在继承条件才可以使用
-
构造方法:this()本类的构造,super()父类的构造
-
方法重写@override:需要有继承关系,子类重写父类的方法
-
方法名必须相同,参数列表必须相同
-
修饰符:范围可以扩大,不能缩小,public>protected>default>private
-
抛出异常:范围可以被缩小,不能扩大classnotfoundexception ->exception(大)
-
方法的调用只和左边,定义的数据类型有关:A extends B B b = new A();
-
为什么需要重写:父类的功能,子类不一定需要,或者不一定满足
-
多态:动态编译:类型的可扩展性变强
-
一个对象的实际类型是确定的,可以指向的引用类型就不确定了,父类引用指向子类对象。
-
对象能执行那些方法,主要看对象左边的类型
-
多态是方法的多态,属性没有多态
-
父类和子类,有联系可以进行转换,否则就会类型转换异常
-
存在条件:继承关系,子类重写父类方法,父类引用指向子类对象,Father f1=new Son();
-
static方法属于类,不属于实例,不能重写
-
final常量,不能重写,final修饰的类没有子类(断子绝孙)
-
private方法,不能重写
-
instanceof 类型转换 引用类型,判断一个对象是什么类型
-
能否编译通过取决于二者是否有父子关系
-
父类引用指向子类的对象
-
把子类转换为父类,向上转型
-
把父类转换为子类,向下转型:强制转换
-
方便方法的调用,减少重复的代码
匿名代码块{ }与对象一起加载
静态代码块static{ }与类一起加载
new一个对象时的加载顺序:1,静态代码块,只在加载类时执行一次,2,匿名代码块,3,构造方法
-
抽象类:用来被继承(类只能单继承extends,但是接口可以多继承implements)
-
不能new这个抽象类,只能靠子类去实现它;约束
-
抽象类中可以写普通方法,抽象方法必须在抽象类中
-
存在的意义:提高开发效率
-
接口:只有规范,自己无法写方法,专业的约束。约束和实现分离:面向接口编程。(普通类只有具体实现,抽象类有具体实现和规范(抽象方法))
-
接口就是规范,定义的是一组规则
-
接口的本质是契约,可以多继承
-
接口中的所有定义的方法是默认抽象的public abstract,必须被重写
-
接口中定义的属性是默认静态常量 public static final
-
接口不能被实例化,接口中没有构造方法
-
内部类:在类的内部再定义一个类,可以访问外部方法的属性
局部类:定义在方法内部
-
异常Exception。当做对象来处理,java.lang.Throwable
-
检查性异常:用户错误或问题引起的无法预见的异常
-
运行时异常:可以被避免。
-
错误:错误不是异常,而是脱离控制的问题,在代码中通常被忽略。如栈溢出,编译时一般检查不到错误。
-
异常处理:try,catch,finally,throw,throws
-
自定义异常:除了java内置的异常之外还可以自定义异常
-
总结: