Java基础
环境准备
-
安装JDK
-
配置环境变量
-
安装开发工具(IDEA)IDEA
-
IDE(集成开发环境,是用于提供程序开发环境的应用程序)
-
IDEA,开发Java代码
-
WebStorm,开发前端代码
-
DataGrip,数据库连接
-
基础语法
-
注释
-
当行注释
-
//单行注释
-
多行注释
-
/*
多行注释
*/ -
文档注释
/**
*@auther
*@date
@version
**/百度>有趣的代码注释
-
_(\_/)
,((((^`\
(((( (6 \
,((((( , \
,,,_ ,((((( /"._ ,`,
((((\\ ,... ,(((( / `-.-'
))) ;' `"'"'""(((( (
((( / ((( \
)) | |
(( | . ' |
)) \ _ ' `t ,.')
( | y;- -,-""'"-.\ \/
) / ./ ) / `\ \
|./ ( ( / /'
|| \\ //'|
|| \\ _//'||
|| )) |_/ ||
\_\ |_/ ||
`'" \_\
`'"
标识符
-
关键字
-
所有标识符都应该以字母(A-Z或者a-z),美元符($),下划线(_)
-
标识符是大小写敏感的
数据类型
-
强类型语言(Java)
-
要求变量的使用要严格负荷规定,所有变量都必须先定义后才能使用。
-
-
弱类型语言
-
Java的数据类型分为两大类
-
基本类型(primitive type)-八大基本数据类型
-
数值类型
-
整数类型
-
byte占1个字节范围:-128~127
-
short占2个字节范围:-32768~32767
-
int占4个字节范围:-21亿~21亿
-
long占8个字节
-
-
浮点类型
-
float占4个字节
-
double占8个字节
-
-
字符类型
-
char占2个字节
-
-
-
boolean类型
-
占1位(值只有true和false)
-
-
-
引用类型(reference type)
-
-
存储单位
类型转换
变量
简述
变量就是可以变化的量。
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
type varName [=value] [{,varName=[value]}]
类变量
实例变量
局部变量
命名规范
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则:monthSalary
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线原则:MONTH_SALARY
方法名:首字母小写和驼峰原则:run
运算符
算数运算符:+,-,*,/,%,++,--
复制运算符:=
关系运算符:>,<,>=,<=,==,!=instanceof
逻辑运算符:&&,||,! 与,或,非
位运算符:&,|,^,~,>>,<<,>>>
条件运算符:?,:
扩展复制运算符:+=,-=,*=,/=
优先级:()
A = 0011 1100
B = 0000 1101
------------------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 1101
~B = 1111 0010
2*8 = 16
2*2*2*2
<< 左移 *2
>> 右移 /2
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 0101 5
0000 1000 8
0001 0000 16
Java流程控制
用户交互Scanner
顺序结构
选择结构
循环结构
break & continue
Java方法
什么是方法
-
Java方法是语句的集合,它们在一起执行一个功能
-
方法是解决一类问题的步骤的有序组合
-
方法包含于类或对象中
-
方法在程序中被创建,在其他地方被引用
-
-
设计方法的原则
方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于后期的扩展。
-
方法的命名规则
驼峰
方法的定义
-
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
-
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
-
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了方法的访问类型。
-
返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。
-
方法名:是方法的实际名称。
-
参数类型:参数像是一个占位符。当方法被调用是,传递值给方法。参数是可选的
-
形式参数:用来定义作用的参数
-
实参:实际调用传递的参数
-
-
方法体:方法体包含具体的语句,定义该方法的功能。
-
方法的重载
-
重载就是在一个类中,有相同的方法名,但是参数不同。
-
方法的重载规则:
-
方法名必须相同
-
参数列表必须不通(个数不用,或类型不同、参数顺序不同等)
-
方法的返回值可以相同也可以不相同
-
仅仅返回值类型不同不足以成为方法的重载
-
-
实现理论
方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
命令行传参
-
javac 编译
-
命令行中需切换到包的路径下
java wx.method.Demo3 参数...
可变参数
-
JDK1.5开始,Java支持传递同类型的可变参数给一个方法
-
在方法声明中,在指定参数类型后加一个省略号(...)
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通参数都必须在它之前声明
public static void main(String[] args) {
test(1,2,3,4,5,56,6,7);
test(new int[]{9,8,7,6,56});
}
public static void test(int...a){
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
递归
-
A方法调用B方法
-
递归就是A方法调用自己
-
利用递归可以用简单的程序来解决一些复杂的问题。
-
递归结构包括两个部分
-
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环
-
递归体:什么时候需要调用自身方法
-
数组
数组的概念
-
数组是相同类型数据的有序集合
-
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
-
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问
数组声明创建
-
首先必须声明数组变量,才能在程序中使用数组。
dataType[] arrayName;//首选
dataType arrayName[];//效果相同,不是首选方法 -
Java语言使用new操作符来创建数组
dataTpe[] arrayName = new dataType[size];
-
数组的元素是通过索引访问的,数组索引从0开始
-
获取数组的长度
arrays.length
-
三种初始化
-
静态初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)}; -
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2; -
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量吗,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
-
数组使用
-
For-Each循环
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
//打印全部的数组原色
for (int i : a) {
System.out.println(i);
}
} -
数组作方法入参
-
数组作返回值
多维数组
-
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
-
二维数组
int a[][] = new int[2][5];
Arrays类
-
数组的工具类java.util.Arrays
-
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用
-
查看JDK帮助文档
-
Arrays类中的方法都是static修饰的静态方法
-
具有以下常用功能
-
给数组赋值:通过fill方法
-
对数组排序:通过sort方法,按升序
-
比较数组:通过equals方法比较数组中元素值是否相等
-
查找数组元素:通过binartSearch方法能对排序好的数组进行二分查找法操作
-
冒泡排序
-
冒泡排序无疑是最出名的排序算法之一,总共有八大排序。
-
冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层一次比较。
-
这个算法的时间复杂度为O(n2)
稀疏数组
-
当一个数组中大部分元素为0,或者为同意值的数组时,可以使用稀疏数组来保存该数组。
-
稀疏数组的处理方式是:
-
记录数组一共有几行几列,有多少不同值
-
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
-
如下图:左边是原始数组,右边是稀疏数组
数据结构
Java内存
向对象编程
面向对象
-
面向过程
-
步骤清晰简单,第一步做什么,第二部做什么...
-
面对过程适合处理一些较为简单的问题
-
-
面向对象
-
物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
-
面向对象适合处理复杂的问题,适合处理需要多人协作的问题
-
-
对于描述复杂的事务,为了从宏观上把我,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
-
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据 。
-
抽象
-
三大特性
-
封装
-
集成
-
多态
-
-
从认识伦角度考虑是先有对象后有类。对象,是具体的事务。类,是抽象的,是对对象的抽象。
-
从代码的运行角度考虑是先有类后有对象。类是对象的模板。
方法
-
方法的定义
-
修饰符
-
返回类型
-
break:结束当前循环和;return:表示方法结束;continue:表示调出当前。
-
方法名:注意规范
-
参数列表:(参数类型,参数名)
-
异常抛出
-
-
方法的调用
-
静态方法
-
非静态方法
-
形参和实参
-
值传递和引用传递
-
this关键字
-
对象的创建
-
使用new关键字创建
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有两个特点:
-
必须和类的名字相同
-
必须没有返回值类型,也不能写void
构造器:
-
1、和类名相同
2、没有返回值
作用:
1、new本质在调用构造方法
2、初始化对象的值
注意点:
1、定义有参构造之后,如果想使用无参构造,需要显示的定义一个无参构造
-
类与对象
类是一个模板:抽象,对象是一个具体的实例
-
方法
定义,调用
-
对象的引用
引用类型:基本类型(8大基本类型)
对象是通过引用来操作的:栈--->堆
-
属性:字段Field成员变量
默认初始化:
数字:0 0.0
char: u0000
boolean:false
引用:null
修饰符 属性类型 属性名 = 属性值
-
对象的创建和使用
必须使用new关键字创建对象,构造器 Person person = new Person();
对象的属性 person.name
对象的方法 person.sleep();
-
类:
静态的属性 属性
动态的行为 方法
封装、继承、多态
面向对象三大特性
-
封装
-
该露的露,该藏得藏
程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
-
封装(数据的隐藏)
通常,应禁止直接访问一个对象中的数据的实际标识,而是通过操作接口来访问,这称为信息隐藏
-
属性私有,get/set
-
提供程序的安全性,保护数据
-
隐藏代码的实现细节
-
统一接口
-
系统可维护性增加
-
-
继承
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extands的意思是“扩展”。子类是父类的扩展
-
JAVA中类只有单继承,没有多继承
-
继承是类和类之间的一种关系。初次之外,类和类之间的关系还有依赖、组合、聚合等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)、子类继承父类,使用extands关键字来表示。
-
子类和父类之间,从意义上讲应该具有“is a”的关系
-
object类
-
super-this
-
super调用父类的构造方法,必须在构造方法第一个
-
super必须只能出现在子类的方法或者构造方法中
-
super和this不能同时调用构造方法
super VS this
-
代表的对象不用:
-
this:本身调用者这个对象
-
super:代表父类对象的引用
-
-
前提:
-
this:没有继承也可以使用
-
super:只能在继承条件下使用
-
-
构造方法:
-
this();本类的构造
-
super();父类的构造
-
-
-
方法重写
-
需要有继承关系,子类重写父类的方法
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大,单不能缩小:public>protected>default>private
-
抛出的异常:范围可以被缩小,但不能扩大;ClassNotFountException-->Exception(大)
-
重写,子类的方法和父类必须要一致;方法体不同
-
为什么需要重写
-
父类的功能,子类不一定需要或者不一定需
-
Alt + Insert : override
-
-
-
-
多态
-
动态编译:类型,可扩展
-
即统一方法可以根据发送对象的不同而采用多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
-
多态存在的条件
-
有继承关系
-
子类重写父类的方法
-
父类引用指向子类对象
-
-
多态是方法的多态,属性没有多态性
-
instanceof 类型转换 > 引用类型
多态注意事项:
1. 多态是方法的多态,属性没有多态
1. 父类和子类,有联系
1. 存在的条件:继承关系,方法需要重写,父类引用指向子类对象。Father f = new Son();-
父类引用指向子类的对象
-
把子类转换为父类,向上转型
-
把父类转换为子类,向下转型,强制转换
-
方便方法的调用,减少重复的代码
-
抽象类和接口
抽象类
-
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
-
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
-
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的
-
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
-
子类继承抽象类,那么久必须要实现抽象类没有实现的抽象方法,否则该子类也需要声明为抽象类
1.不嫩new这个抽象类,只能靠子类去实现它;约束
2.抽象类中可以写普通方法
3.抽象方法必须在抽象类中
接口(interface)
-
普通类:只有具体实现
-
抽象类:具体实现和规范(抽象方法)都有
-
接口:只有规范
-
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。如果你是汽车,则必须能跑
-
接口的本是是契约,就像我们人间的法律一样。指定好后大家遵守
-
OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式只针对具备了抽象能力的语言(比如c++,java,c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
作用:
1. 约束
1. 定义一些方法,让不同的人实现
1. 方法都是public abstract的修饰的
1. 常量都是public static final修饰的
1. 接口不能被实例化,接口没有构造方法
1. implements可以实现多个接口
1. 必须要重写接口中的方法
内部类及OOP
-
内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对A类来说就成为内部类,而A类相对B类来说就是外部类了
-
成员内部类
-
静态内部类
-
局部内部类
-
匿名内部类
异常
-
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译是不能被简单的忽略
-
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以再编译时被忽略
-
错误(ERROR):错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译时也检查不到。
-
抛出异常
-
捕获异常
-
异常处理五个关键字
try、catch、finally、throw、throws
//Ctrl + Alt + T
try {
} catch (Exception e) {
//打印错误的栈信息
e.printStackTrace();
} finally {
}
自定义异常
集合
IO流
标签:Java,子类,基础,数组,类型,new,父类,方法 From: https://www.cnblogs.com/wx-36/p/16914488.html