java笔记2020.3.5整理
主要学习途径
- java官方文档 https://www.oracle.com/cn/java/technologies/java-se-api-doc.html
- 【尚学堂】Java300集 - 高琪
https://www.bilibili.com/video/av59814573 - Java知识体系最强总结(2020版)
https://blog.youkuaiyun.com/ThinkWon/article/details/103592572?depth_1-utm_source=distribute.pc_feed.none-task&request_id=&utm_source=distribute.pc_feed.none-task - 菜鸟教程java https://www.runoob.com/java/java-tutorial.html
- 阿里云大学java路线 https://edu.aliyun.com/roadmap/java?spm=5176.13345299.1392477.3.4753f153Tt7FS1
面向对象编程(oop)
面向对象的三大特性
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
五大基本原则
单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象。
开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。
里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。
依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。
总结
抽象会使复杂的问题更加简单化。
从以前面向过程的执行者,变成了张张嘴的指挥者。
面向对象更符合人类的思维,面向过程则是机器的思想
基本语法
编写 Java 程序时,应注意以下几点:
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的 Java 程序由 public static void main(String []args) 方法开始执行。
变量
- 变量的本质是一个“可操作的存储空间”
- 空间位置是确定的,我们可以通过变量名来访他的空间
- 变量必须声明后才能使用
局部变量
- 方法或语句块内部定义的变量,生命周期是从声明位置开始到方法或语句块执行完毕为止
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
成员变量(实例变量)
- 方法外部,类的内部定义的变量。从属于对象,生命周期伴随对象始终
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过
- 用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是nu
静态变量(类变量)
- 使用static定义。从属于类,生命周期伴随类始终,从类加载到卸载
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量
- 常量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
- 默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为public static
- final类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。
代码示例
public class TestVariable {
int a; //成员变量,从属于对象;成员变量会被自动初始化
static int size; //静态变量,从属于类
public static void main(String[] args) {
{
int age; //局部变量,从属于语句块;
age = 99;
}
int salary = 3000 // 局部变量,从属于方法
}
}
Java语言规定变量在使用之前必须初始化,即必须给该变量赋予特定的值。如下列代码:
public static void main(String[] args) {
int a, b = 10;
int c = a + b;
//编译错误,变量a没有初始化
System.out.println(c);
}
在上述代码中,
代码行int c = a +b;处会出现编译错误,因为此行代码使用到了变量a,但是该变量却有被初始化。
另外,有些语句结构(如if、for等)需要条件满足时才会执行;
Java编译器不认为在这些语句块中的赋值语句可以实现初始化操作。查看如下代码:
int sum;
int a = 20;
int b = 10;
if(a>0) {
sum = 0;
// 当a大于0的时候,该语句才会执行。
sum = a + b;
}
System.out.println(sum);
// 编译错误,编译器认为sum没有初始化。
上述代码中,语句System.out.println(sum);
处会出现编译错误,Java编译器不认为放在if语句块中的sum=0;可以实现初始化操作。
Java中的变量的命名必须符合Java标识符的规则:
- 可以以字母、数字、“_”和“$”符组成;
- 首字符不能以数字开头;
- 中文可以作为变量名,但不提倡使用;
- Java大小写敏感,命名变量时需要注意;
- 不能使用Java保留字(一些Java语言规定好的,有特殊含义的字符),如:int、if、for、break等。
下面的代码体现了Java变量的命名规则:int 123go = 100; // 编译错误,不能以数字开头。 int成绩 = 60; // 编译没错,但不建议使用。 int break= 200; // 编译错误,break是Java保留字。 int score = 80; System.out.println(Score); // 编译错误,Java大小写敏感,Score变量没有声明。`
上述代码中,分别有如下错误:
- 变量“123go”不符合Java的命名规范,原因是变量名不能以数字开头;
- 变量“成绩“编译时是正确的,但是这种使用汉字进行命名的方式不建议使用;
- 变量”break“处会出现编译错误,原因是break是Java的保留字,不能作为变量名;
- 在输出变量”Score“处会出现编译错误,原因是变量名是大小写敏感的。int score=80;处声明的变量和下一行代码中输出的Score是两个变量,所以变量Score没有声明。Java语言语法规定,变量使用之前必须声明,否则会有编译错误。
另外,Java 变量名的定义应“见名知意”;同时,Java编程规范要求:变量的命名需采用“驼峰命名法”,例如:salary、empNostudentName等。
常量
- 常量定义:在程序执行的过程中,其值不可以发生改变的量。常量不同于常量值,它可以在程序中用符号来代替常量值使用,因此在使用前必须先定义。
- 常量值定义:常量和常量值是不同的概念,常量值又称为字面常量,它是通过数据直接表示的。
关系:常量值是常量的具体和直观的表现形式,常量是形式化的表现。通常在程序中既可以直接使用常量值,也可以使用常量
数据类型
-
Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定。由于是statical typed,导致Java语言也是强类型(Strong typed)的。强类型意味着每个变量都具有一种类型,每个表达式具有一种类型,并且每种类型都是严格定义的,类型限制了变量可以hold哪些值,表达式最终产生什么值。同时限制了这些值可以进行的操作类型以及操作的具体方式。所有的赋值操作,无论是显式的还是在方法调用中通过参数传递,都要进行类型兼容性检查。
-
Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
8 种类型表示范围如下:
1.byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
2.short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
3.int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
4.long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
5.float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
6.double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
7.boolean:只有true和false两个取值。
8.char:16位,存储Unicode码,用单引号赋值。
Java决定了每种简单类型的大小。这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。下表列出了Java中定义的简单类型、占用二进制位数及对应的封装器类。
-324~1.8e308,赋值时可以加d或D也可以不加。
7.boolean:只有true和false两个取值。
8.char:16位,存储Unicode码,用单引号赋值。
Java决定了每种简单类型的大小。这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。下表列出了Java中定义的简单类型、占用二进制位数及对应的封装器类。