目录
学习方法
真理:实践 >= 理论
不管是否理解,难或简单,都需要动手独立将代码写出来,输入知识固然重要,可若是不懂输出,学再多再好最后也是是遗忘,写博客笔记就是一种特别好的方法,别问我为什么知道的(痛哭)
遇到难以理解的知识时,最好的学习方法是先学会使用,这比理解原理简单的多,而多使用自然就会逐渐理解其原理
作为工科生,最不能缺少的就是实践能力。理论学习只停留在了解这一方面,要真正理解,就要善于利用知识,输出知识。同时,计算机领域的知识特别是底层原理(计算机的构成,操作系统,编译原理等)是极其抽象和难以理解的,一定要通过实践辅助理解
遇到难以理解的地方也不要急于求成想一次学会,多次去温习理解才能形成自己的理解体会,这才叫真正懂了
Java的应用领域
我学习Java的目的主要就是为了 服务器开发 及 安卓开发 ,此外还可用于开发游戏,编译器软件等
Java历史概述
Java的老祖宗Oak语言诞生于1991年的SUN公司,由James 高斯林(Java之父)及其团队开发,起初希望用于嵌入式开发,但没人买账,好在因为互联网的高速发展,SUN公司看到了它在互联网应用上的前景,并改名为Java(爪洼岛以咖啡著名),从此命运的齿轮开始转动,如今已成为Web服务器开发的老大哥
Java已经经历了多个版本,其中主流的是几个长期支持版本 Java8 Java11 Java17 功能也逐渐增多
Java
Java基本概念
//简单的知识仅以文字或图片说明
JDK(Java Development Kit)
即Java 开发工具包,包括
JVM虚拟机:Java运行的操作系统
核心类库:Java已经定义的类
开发工具:开发Java代码的工具
其中,JVM和核心类库合称JRE(Java Runtime Environment )Java运行环境
Java跨平台的原理
Java代码编译产生的二进制代码只需在JDK的JVM中运行的,而不需兼容使用操作系统
Java语法
注释
注释:仅用于代码解释,分为三类
单行注释:注释一行,idea快捷键 Ctrl+/
多行注释:注释多行,idea快捷键 Ctrl+Shift+/
文档注释:专用于请求,函数等代码之前说明代码的名字,参数,作用等 idea快捷键,输入/**即可自动代码补全
关键字
在Java中已经被定义,被赋予特殊含义的类名,函数名,变量类型名,常量名等一系列单词
如 class public System Math void int
字面量
变量
用于存储数据的容器 声明变量: 变量类型 变量名=变量初始数值; 如:int num=100;
数据类型
标识符
即变量的名称
其他规范请参考阿里巴巴编码规范(随便搜,到处都是)
键盘录入
即C的scanf,C++的cin,Javascript的prompt输入函数
Scanner其他用法强烈建议查阅开发文档,学会使用开发文档是一个合格程序员的基本能力,刚开始看不懂也没关系,基础阶段不要求掌握,慢慢接受
Idea的安装与使用
安装同平台全是教程,不再赘述
Idea作为一款超多功能的集成开发工具(IDE),肯定是要收费的,不过在校学生可以去申请Jerbrains的学生认证,认证成功可以免费使用一年,每年都能申请
使用Idea一定要逐渐掌握该软件的新建项目的结构与过程,快捷键的使用,插件的安装(当成逛超市)提高编码效率,工作同样会使用Idea
运算符
算术运算符
隐式转换 显式转换
隐式:不同类型数运算时,小类型自动转换为大类型 num=100+0.1=100.1
显式:自己手动转 num=(int)(100+0.1)=100;
字符自动转换为Ascll码数,字符串相加全部转换为字符串(从左到右)
自增自减运算符
赋值运算符
关系运算符
逻辑运算符
短路逻辑运算符
运算优先级
三元运算符
格式: 数据类型 result(变量名)=表达式?值1 : 值2
当表达式为true,则result=值1,当表达式为flase,则result=值2
流程控制语句
和其他编程语言一样,Java的流程控制语句包括顺序语句,判断语句和循环语句
顺序语句
即程序执行的顺序按代码从上至下依次执行
判断语句
if语句
if-else语句
if-else if-else语句
switch语句
循环语句
for循环
while循环
数组
一个将同种类型的数据存储在一起的容器
数组的定义
数组的静态初始化
数组的动态初始化
数组的索引
方法
方法即函数,是一段具有特殊功能的独立代码,是对复用性高的代码的整合方便于直接调用
方法的定义
方法的重载
重载用于解决业务相同而参数类型,参数数目不同的问题
基本数据类型与引用数据类型
基本数据类型:储存的是真实的数值,分配内存在栈
引用数据类型:储存的是数值的地址,类似于c的指针,分配内存在堆
Java语法基础到此结束,语法只是工具,但却是基石,一定要做到能懂会用!
面向对象编程基础
面向对象编程
面向对象编程(Object Oriented Programming)简称OOP,在我理解就是将万事万物都抽象成一个Object对象便于程序员使用的开发方式,注重结果直接使用,而非c语言(面向过程编程(POP))一样注重过程,它与面向切面编程(AOP)是Java中极其重要的两个编程思想,有点抽象,多用就能有自己的理解
类与对象
类:用class关键字修饰的变量就可以看作一个类,类似于c语言的结构体(struct)
对象:将物体的属性与行为定义在一个类中,这个类就是对象
下面是一个学生类的对象
public class Student { //class修饰的一个变量就是一个类(粗略理解) //学生类属性 String name; //学生姓名信息 int age; //学生年龄信息 //学生类方法(行为) void study(){ System.out.println("学习"); //学生学习的行为 } }
对象的使用:
public class test { public static void main(String[] args) { Student Lihua=new Student(); //创建一个名叫李华的学生对象 LiHua.age=19; //为李华年龄赋值 System.out.println(Lihua.age); //打印李华的年龄 Lihua.study(); //调用李华的方法(行为) } }
封装
封装是面向对象三大特性之一,另外两个是继承与多态
封装就是定义一个对象的规范,将物体封装成一个JavaBean类,这个JavaBean的类就是一个规范的对象 ,JavaBean类中必须定义属性与方法(上面那样),且遵循以下规范
规范1:修饰符
对象的属性与方法必须用修饰符修饰,且属性一般用private修饰,方法用public修饰(用private修饰的属性与方法外界不可访问,只有类中可以访问,public外界可以直接调用)
规范2:属性必须提供修改与查询方法
必须为属性添加get与set方法
规范3:构造方法
可以为对象提供构造方法,构造方法就是在new对象时同时可以为对象属性赋值的new方法重载,
可以不写,因为系统有默认构造方法(空参构造)
一个完整的JavaBean
如下
public class Student { //class修饰的一个变量就是一个类(粗略理解) //学生类属性 private String name; //学生姓名信息 规范1添加了修饰符private private int age; //学生年龄信息 public Student() { //默认构造方法 } //规范3 public Student(String name, int age) { //有参构造方法(可以new时为对象赋值) this.name = name; //this就是对象本身 this.age = age; } //学生类方法(行为) public void study(){ System.out.println("学习"); //学生学习的行为 } //规范2 //姓名属性的获取(get) public String getName() { return name; } //姓名属性的更改(set) public void setName(String name) { this.name = name; } //年龄属性的获取(get) public int getAge() { return age; } //年龄属性的改变(set) public void setAge(int age) { this.age = age; } }
构造方法
构造一个对象时调用的 特殊方法,当使用new时,虚拟机自动调用构造方法,分为空参构造,带参构造,系统默认构造方法为空参构造,一旦手写构造方法就必须重写空参和带参
格式:
注意事项
总结
JavaBean类的规范
即对象类的规范,封装中有提到,不再赘述
基础数据类型与引用数据类型
成员变量与局部变量
字符串与ArrayList集合
API帮助文档
学会使用帮助文档是每一个合格程序员所掌握的基本能力,你可以不用,但你不能不会。虽然这些问题在google等搜索引擎上有很多答案与大佬的详解,但开发文档拥有的是绝对的正确性与全面性(要看懂会有点难)
JDK11 API帮助文档中文版
https://www.runoob.com/manual/jdk11api/index.htmlhttps://www.runoob.com/manual/jdk11api/index.html
String(字符串)
字符串的构造方法
直接赋值与new的差异
new:如果使用new方法构造字符串,每构造一个字符串就会在堆中占用一片空间,十分浪费内存
直接赋值:而直接赋值字符串同样存储与堆中,不同的是它会存储于堆中的特殊空间串池中,在串池中的字符串是唯一的,一种字符串共用一个地址,直接赋值构造已存在的字符串便不会占用新的内存,而是直接引用串池中相同字符串地址
"==" 与 equals
”==“:基本数据类型比较的是数值,引用数据类型比较的是地址值
equals:严格比较数值
String str1="abc"; //串池字符串地址
String str2=new String("abc"); //堆区字符串地址
str1 == str2; //引用类型比较地址,false
str1.equals(str2); //严格比较数值,true
StringBuilder
概述
构造方法
常用方法(API帮助文档可以看一看)
代码示例
StringBuilder sb=new StringBuilder("abc"); //构造StringBuilder System.out.println(sb); //abc sb.append("def"); //尾部拼接 System.out.println(sb); //abcdef sb.reverse(); //反转StringBuilder System.out.println(sb); //fedcba System.out.println(sb.length()); //获取长度 6 String str=sb.toString(); //转换为真正字符串 System.out.println(str); //fedcba //链式编程 String str1=sb.append("1").append("2").append("3").reverse().toString(); System.out.println(str1); //321abcdef
StringJoiner
StringJoiner在拼接字符串的基础下还能指定字符串拼接格式
构造方法
成员方法
代码示例
StringJoiner stringJoiner=new StringJoiner(",","(",")"); //构造函数,指定分隔符,左边界符,右边界符 String str=stringJoiner.add("1").add("2").add("3").toString(); //函数式编程,和StringBuilder差不多 System.out.println(stringJoiner.length()); //7(包括边界符与分隔符) System.out.println(str); //(1,2,3)
总结
ArrayList集合
概述:
ArrayList集合就是一个可变的数组,它实现了自动扩容,不过它只能存储引用类型数据或者基础数据类型包装类,简单动态数组实现可见https://blog.youkuaiyun.com/m0_73766765/article/details/134676680https://blog.youkuaiyun.com/m0_73766765/article/details/134676680
集合(其实就是数据结构的封装的API)作为Java中极其重要的知识,ArrayList只是其中一个重要的子类,在开发中广泛应用
ArrayList的创建
ArrayList<数据类型> list=new ArrayList<>();
代码示例
ArrayList<String> list=new ArrayList<>();
成员方法
API可以查询开发文档,不再赘述
基本类型对应包装类
集合中使用基本类型必须要使用对应包装类
面向对象进阶
Static关键字
Static即静态修饰符,在JavaBean中可用于修饰成员变量或成员方法,使其成为静态共享属性或方法,被Static修饰符修饰的属性或方法会存储于堆中的静态方法区中
凡是被Static关键字修饰的成员变量,该类的所有实例对象共用同一该成员变量属性,方法也是一样,故静态成员变量一定是该对象所共有的属性,静态方法一般不用于JavaBean类中,而是用于构建工具类中的方法
工具类
工具类中方法都为静态方法,且工具类无需实例化,其方法直接使用类名调用
注意事项
继承
继承是面向对象的三大特性之一 ,在开发时应用十分广泛,极大提高了代码的复用性,其作用为当Object类A继承了类B,那么类A会继承获得类B的所有属性与方法,不同于C++允许多继承(一个类继承多个类),Java只允许多级继承(可以继承已经继承的类)
继承规则
构造方法不能继承,成员变量都可以继承,成员变量只能继承虚方法表里的方法
虚方法表
虚方法表中只保留 非私有 非final 非static修饰的成员方法且不包含构造方法,虚方法表自Object类开始保留了每一个父类的可继承方法
继承中属性访问特性
继承方法的重写
当子类需要更改父类的继承下的方法时必须重写
多态
多态通俗来说就是一个拥有很多子类的父类可以接收子类的实例类并获得子类的部分属性与方法
应用:当我们要接收多种不确定子类时可以用父类作为参数达成目的
多态定义示例
Object object=new Person(); Person teacher=new teacher(); Person student=new Student();
多态对象属性与方法的调用
成员变量:编译看左边,运行也看左边
成员方法:编译看左边,运行看右边
多态的优势
多态的弊端
不能调用子类特有功能
包
其实就是类文件的全称
规则:公司域名+类作用名
final关键字
final是Java中的修饰符,类似于C中的const修饰符
权限修饰符
知道private只能在类内部调用,public任何地方都可以调用就行
静态代码块
当类加载时自动执行(只执行一次)先于构造函数调用
代码示例
package Object; public class Student { //class修饰的一个变量就是一个类(粗略理解) //学生类属性 private String name; //学生姓名信息 规范1添加了修饰符private private int age; //学生年龄信息 //--------------------------看这里------------------------------------------ static { System.out.println("初始化数据"); //静态代码块,一般用于初始化数据 } //---------------------------看这里----------------------------------------- public Student() { //默认构造方法 } //规范3 public Student(String name, int age) { //有参构造方法(可以new时为对象赋值) this.name = name; //this就是对象本身, this.age = age; } //学生类方法(行为) public void study(){ System.out.println("学习"); //学生学习的行为 } //规范2 //姓名属性的获取(get) public String getName() { return name; } //姓名属性的更改(set) public void setName(String name) { this.name = name; } //年龄属性的获取(get) public int getAge() { return age; } //年龄属性的改变(set) public void setAge(int age) { this.age = age; } }
抽象类与抽象方法
了解过C++的应该也不陌生,其实就是定义一个规范专门让子类执行实现,为了统一继承子类成员方法格式并强行重写继承方法,由于Java中有接口这个好像用的不多(个人看法,真没怎么用过),和下文接口差不多,偷个懒
接口
接口就是定义了一个行为规范给需要类实现,接口不能实例化,实现接口的对象必须重写其方法,可实现多接口,和继承不冲突
接口新特性
允许定义默认方法(不强制要求重写)
避免让不需要的类也重写
允许定义静态方法
允许定义私有方法
私有方法只能给接口中方法使用
匿名内部类
内部类:类的五大成员之一(成员变量,成员方法,构造函数,代码块,内部类)
匿名内部类
用于直接创建一个实现抽象类或接口的类的实例对象,本质是获得一个对象,可以直接调用接口或抽象类中的方法和属性,和正常实现类一样,当实现类只用一次的时候使用