Java基础知识回顾与总结
前端Vue学习完了后,开始后台的学习了。必不可少的知识点当然要从Java开始讲起,老师用了7天的时间把知识点快速的过了一遍,现在通过CSDN这个平台记录一下自己的学习笔记与成果。
一方面为了加深自己的印象为之后学Springboot做铺垫。另一方面呢也分享给正在学习Java的小伙伴,一起学习巩固一下知识点加深印象吧。
文章目录
前言
随着日益竞争激烈的当代社会,扎实与基础的力量是无穷的。无论什么样的工作岗位都需要雄厚的功底,只有掌握良好的基础才能在自己坚持的这条路上走的长远。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Java语言的概述
1.第一代语言:打孔机——纯机器语言。2.第二代语言:汇编
3.第三代语言:C、Pascal、Fortran面向过程的语言,C++面向过程/面向对象,Java跨平台的纯面向对象的语言、.NET跨语言的平台。
二、Java与语言的主要特性
1.Java语言是易学的,java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和实用Java。
2.Java语言是强制面向对象的,Java语言提供类、接口、和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements).
3.Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,暴扣URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
4.Java语言是健壮的;Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。
5.Java语言是安全的;Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码攻击。如:安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查。
6.Java语言是体系结构中立的;Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class文件),然后可以在实现这个Java的任何系统中运行。
7.Java语言是解释型的;如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java的任何系统的解释器中运行。
8.Java是性能略高的;与那些解释型的高级脚本语言相比Java的性能还是较优的。
9.Java语言是原生支持多线程的;在Java语言中,县城是一种特殊的对象,他必须由Thread类或其子孙类来创建。
2.Java语言的运行机制以及运行过程
2.1Java语言的特点:
特点一: 面向对象
1》两个基本概念:类、对象
2》三大特性:封装、继承、多态
特点二: 健壮性
1》吸收了C /C++语言的有点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
特点三: 跨平台性
1》跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。用一句英文可以这样表示,“Write once,Run Anywhere” —写一次,到处运行。
2》原理:只要在需要运行Java应用程序的操作系统上,先安装一个Java虚拟机 (JVM Java Virtual Machine) 即可。由JVM类负责Java程序在该系统中运行。
三、JavaAPI文档、关键字与变量
3.1.API(Application Programming interface ,应用程序编程接口)是Java提供的基本编程接口。
3.2.Java语言提供了大量的基础类,因此Oracle也为这些基础类提供了相应的API文档,用于告诉开发者如何实用这些类,以及这些类里包含的方法。
3.3.下载API:
API官方文档
http://www.oracle.com/technetwork/java/javase/downloads/index.html
3.4 关键字
关键字的定义特点:
定义: 被Java语言赋予了特殊含义,用用专门用途的字符串(单词)
特点: 关键字中所有字母都为小写
1》用于定义的数据类型的关键字:class、interface、enum、byte、short、int、long、float、double、char、boolean、void.
2》用于定义数据类型值的关键字:true、false、null
3》用于定义流程控制的关键字:if、else、switch、case、default、while、do、for、break、continue、return.
4》用于定义访问权限修饰符的关键字:private protected public
5》用于定类、函数、变量修饰符的关键字:abstract、final、static、synchronized.
6》用于定义类与类之间的关键字:extends、implements
7》用于定义建立实例以及引用实例,判断实例的关键字:new、this、super、instanceof.
8》用于异常处理的关键字:try、catch、finally、throw、throws.
9》用于包的关键字:package import.
10》其他修饰符关键字:native、strictfp、transient、volatile、assert.
3.5 保留字
Java保留字:现有Java版本尚未实用,但以后版本可能会作为关键字使用。自己命名标记符时要避免使用这些保留字
例如: byValue、cast、future、generic、inner、operator、outer、rest、var、goto、const.
3.5 变量的分类-按数据类型
3.5.1-变量的概念
- 内存中的一个存储区域
- 该区域有自己的名称(变量名)和类型(数据类型)
- Java中每个变量必须先声明,后使用
- 该区域的数据可以在同一类型范围内不断变化
3.5.2-基本数据类型的转换
- 自动类型转换:容量小的类型自动转换为容量大的数据类型。
- 数据类型按容量大小排序为:
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
四、运算符
4.1.概念:
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
分类:
- 算术运算符
- 赋值运算符
- 比较运算符(关系运算符)
- 逻辑运算符
- 三元运算符
4.1.1算数运算符
4.1.2赋值运算符
- 符号:=
- 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
- 支持连续赋值。
- 扩展赋值运算符: +=, -=, *=, /=, %=
4.1.3比较运算符
4.1.4逻辑运算符
注意:
-
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
-
“&”和“&&”的区别:
1.单&时,左边无论真假,右边都进行运算;
2.双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 -
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
-
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
4.1.5三元运算符
五、程序流程控制
顺序结构: 程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构:根据条件,选择性地执行某段代码。有if…else和switch两种分支语句。
循环结构:根据循环条件,重复性的执行某段代码.while、do…while、for三种循环语句。注:JDK1.5开始提供了foreach循环,方便的遍历集合、数组元素。
5.1顺序结构
//Java中定义成员变量时采用合法的前向引用。如:
public class Test{
int num1 = 12;
int num2 = num1 + 2;
}
错误形式:
public class Test{
int num2 = num1 + 2;
int num1 = 12;
}
5.2if-else语句应用举例
public class TestAge{
public static void main(String args[]){
int age = 75;
if (age< 0) {
System.out.println("不可能!");
} else if (age>250) {
System.out.println("是个妖怪!");
} else {
System.out.println(“人家芳龄 " + age +" ,马马乎乎啦!");
}
}
}
}
5.3分支结构2:switch语句
注意:
- switch(表达式)中表达式的返回值必须是下述几种类型之一:byte,short,char,int,枚举,String;
- case子句中的值必须是常量,且所有case子句中的值应是不同的;
- default子句是可任选的,当没有匹配的case时,执行default;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾。
5.4-switch应用举例
public class Test{
public static void main(String args[]){
String season = “summer”;
switch (season) {
case “spring”:
System.out.println(“春暖花开");
break;
case “summer”:
System.out.println(“夏日炎炎");
break;
case “autumn”:
System.out.println(“秋高气爽");
break;
case “winter”:
System.out.println(“冬雪皑皑");
break;
default:
System.out.println(“季节输入有误");
break;
}
}
}
5.5.-for循环语句
应用举例:100以内的所有偶数以及和
public class ForLoop {
public static void main(String args[]){
int result = 0;
for(int i=1; i<=100; i++) {
result += i;
}
System.out.println("result=" + result);
}
}
六、数组
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理。
- 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 数组属引用类型,数组型数据是对象 (object),数组中的每个元素相当于该对象的成员变量。
6.1一堆数组声明
声明方式:
例如:
int a[];
int[] a1;
double b[];
Mydate[] c; //对象数组
注意:Java语言中声明数组时不能指定其长度(数组中元素的数)。
例如: int a[5]; //非法
6.1一堆数组初始化
- 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行。
栗如:
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
//再比如
MyDate dates[];// MyData dates[];
dates = new MyDate[3];
dates[0] = new MyDate(22, 7, 1964);
dates[1] = new MyDate(1, 1, 2000);
dates[2] = new MyDate(22, 12, 1964);
- 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
栗如:
int a[] = new int[]{ 3, 9, 8};
int[] a = {3,9,8};
//再比如
MyDate dates[] = {
new MyDate(22, 7, 1964),
new MyDate(1, 1, 2000),
new MyDate(22, 12, 1964)
}
6.2-数组元素的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。
例如:
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
注意:
1.对于基本数据类型而言,默认初始化值各有不同。
2.对于引用数据类型而言,默然初始化为null(注意与0不同!)
七、面向对象与面向过程
7.1面向对象(OOP)与面向过程
-
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。
-
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
7.2面向对象的三大特征
- 封装(Encapsulation)
- 继承(Inheritance)
- 多态(Polymorphism)
举个栗子:
紧接着讲到的是类与类之间的关系
7.3面向对象的思想概述
-
程序员从执行者转化成了指挥者。
-
完成需求时:
2.1.先去找具有所需功能的对象来用。
2.2.如果该对象不存在,那么创建一个具有所需功能的对象。
2.3这样简化开发并提高复用。 -
类(class)和对象(object)是面向对象的核心概念。
3.1.类是对一类事物描述,是抽象的、概念上的定义对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
3.2. “万事万物皆对象”
同样举栗子:
7.4匿名对象
- 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。如
new Person().shout();
- 使用情况:
1.如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
2.我们 经常将匿名对象作为实参传递给一个方法调用。
7.5方法的重载(overload)
重载的概念:
概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
7.6方法的参数传递
- 方法:必须有其所在类或对象调用才有意义。若方法含有参数:
1.形参:方法声明时的参数
2.实参:方法调用时实际传给形参的参数值
7.7四中访问权限的修饰符
八、构造方法(构造器)
-
构造方法的特征:
1.它具有与类相同的名称。
2.它不声明返回值类型。(与声明为void不同)。
3.不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。 -
构造器的作用:创建对象;给对象进行初始化.
1.如:Order o = new Order(); Person p = new Person(Peter,15);
2.如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。
3.根据参数不同,构造方法可以分为一下两类:
-》隐式无参构造方法(系统默认提供)。
-》显式定义一个或多个构造方法(无参、有参)。
注意:
-》Java语言中,每个类都至少有一个构造方法。
-》默认构造方法的修饰符与所属类的修饰符一致。
-》一旦显式定义了构造方法,则系统不再提供默认构造方法
-》一个类可以创建多个重载的构造器
-》父类的构造方法不可被子类继承
关键字—this
this是什么?
-
在java中,它的作用和其词和接近。
1.它在方法内部使用,即这个方法所属对象的引用;
2.它在构造方法的内部使用,表示改构造器正在初始化的对象。 -
this表示当前对象,可以调用类的属性、方法和构造方法。
使用this,调用属性、方法示例代码:
class Person{ // 定义Person类
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ; }
public void getInfo(){
System.out.println("姓名:" + name) ;
this.speak();
}
public void speak(){
System.out.println(“年龄:” + this.age);
}
注意:
1.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量时类成员。
2. 在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性.
使用this调用本类的构造器:
class Person{ // 定义Person类
private String name ;
private int age ;
public Person(){ // 无参构造
System.out.println("新对象实例化") ;
}
public Person(String name){
this(); // 调用本类中的无参构造方法
this.name = name ;
}
public Person(String name,int age){
this(name) ; // 调用有一个参数的构造方法
this.age = age;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
} }
注意:this可以作为一个类中,构造器相互调用的特殊格式。
关键字supper
在Java类中使用super来调用父类中的指定操作:
- super可用于访问父类中定义的属性。
- super可用于调用父类中定义的成员方法
- super可用于在子类构造方法中调用父类的构造器。
注意:
- 尤其当子父类出现同名成员时,可以用super进行区分。
- super的追溯不仅限于直接父类。
- super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。
示例代码:
class Person {
protected String name="张三";
protected int age;
public String getInfo() {
return "Name: " + name + "\nage: " + age;
} }
class Student extends Person {
protected String name = "李四";
private String school = "New Oriental";
public String getSchool(){ return school; }
public String getInfo() {
return super.getInfo() +"\nschool: " +school;
} }
public class TestStudent{
public static void main(String[] args){
Student st = new Student();
System.out.println(st.getInfo());
} }
九、接口
1.注意:
- 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
- 接口(interface)是抽象方法和常量值的定义的集合。
- 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
- 实现接口类:
class SubClass implements InterfaceA{ }
- 一个类可以实现多个接口,接口也可以继承其它接口。
2.接口的特点:
- 用interface来定义。
- 接口中的所有成员变量都默认是由public static final修饰的。
- 接口中的所有方法都默认是由public abstract修饰的。
- 接口没有构造器。
- 接口采用多继承机制。
接口应用举例:
接口中的其它问题
- 如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类 。
- 接口也可以继承另一个接口,使用extends关键字。
代码举例:
interface MyInterface{
String s=“MyInterface”;
public void absM1();
}
interface SubInterface extends MyInterface{
public void absM2();
}
public class SubAdapter implements SubInterface{
public void absM1(){System.out.println(“absM1”);}
public void absM2(){System.out.println(“absM2”);}
}
十、集合
概述:Java 集合可分为 Collection 和 Map 两种体系。
-
Collection接口:
1.Set:元素无序、不可重复的集合 —类似高中的“集合”。
2.List:元素有序,可重复的集合 —”动态”数组 -
Map接口:具有映射关系“key-value对”的集合 —类似于高中的“函数” y = f(x) (x1,y1) (x2,y2)
Collection接口继承树
Map接口的继承树
Collection接口
- Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
- JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。
- 在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 Java5 增加了泛型以后,Java 集合可以记住容器中对象的数据类型
使用Iterator接口遍历集合
- Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
- 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
- Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。
典型代码:
Iterator i = coll.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
Iterator iterator = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
十一、Map接口
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。
- Map 中的 key 和 value 都可以是任何引用类型的数据。
- Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。
- 常用String类作为Map的“键”。
- key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。
Map实现类之一:HashMap
- Map接口的常用实现类:HashMap、TreeMap和Properties。
- HashMap是 Map 接口使用频率最高的实现类。
- 允许使用null键和null值,与HashSet一样,不保证映射的顺序。
- HashMap 判断两个 key 相等的标准是 :两个 key 通过 equals() 方法返回 true,hashCode 值也相等。
- HashMap 判断两个 value相等的标准是 :两个 value 通过 equals() 方法返回 true。
Map实现类之二:LinkedHashMap
- LinkedHashMap 是 HashMap 的子类。
- 与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。
Map实现类之三:TreeMap
-
TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。
-
TreeMap 的 Key 的排序:
1.自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出异常错误 ClasssCastException。
2.定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口。
还需注意:
- TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。
- 若使用自定义类作为TreeMap的key**,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0。**
Map实现类之四:Hashtable
- Hashtable是个古老的 Map 实现类,线程安全。
- 与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value。
- 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序。
- Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。
总结
好了,Java总结的知识点大概就是这些了,鄙人才疏学浅,文笔与编辑能力有限,错别字与一些结构的优化方面的错误在所难免。还有没有写出来的一些知识点望大佬指点与谅解,如果文章对你有帮助的话,引用B站的话语。别忘了给我一键三连哟谢谢啦(^U^)ノYO
只有把抱怨环境的心情,化为上进的力量,才是成功的保证。——罗曼·罗兰