前言
这些天打算把以前学习的一些知识从头开始做一下总结,有些不清楚的地方自己还要再去深入了解复习,事件可能会比较长,但也要坚持,如果有不对的地方欢迎大佬们的指正。
Java语言能做什么
java语言主要应用于互联网服务的开发领域,像天猫、淘宝、京东、物流等,还可用于后台服务器的数据的存储、查询、数据挖掘等;
Java语言跨平台的原理
java虚拟机(JVM)
- JVM(Java Virtual Machine):java虚拟机,我们编写的java程序都是在JVM上运行
- 跨平台:热播和软件运行都要在操作系统上,java编写的软件可以运行在任何的操作系统上,该特性由JVM实现,不同操作系统使用不同JVM ,允许跨平台的是java程序,不是虚拟机
- JRE(Java Runtime Environment):是java运行时的环境,包含了JVM和java运行是的所需的核心类库
- JDK(Java Development Kit)是java程序的开发工具包,包含JRE和开发工具
JDK>JRE>JVM
数据类型
- 数据类型分类
java数据类型非为两大类 - 基本数据类型:整数、浮点数、字符、布尔
- 引用数据类型:类、数组、接口、枚举
基本数据类型
四类八种基本数据类型
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128至127 |
短整型 | short | 2个字节 | -32768至32767 |
整型 | int | 4个字节 | |
长整型 | long | 8个字节 | |
单精度浮点数 | float | 4个字节 | |
双精度浮点数 | double | 8个字节 | |
字符型 | char | 2个字节 | |
布尔 型 | boolean | 1个字节 | true、false |
- 强制数据类型转换
数据类型 变量名 = (数据类型)被转数据值
逻辑运算符
- 短路逻辑运算符
&& :短路与
如果左边为真,右边执行,如果左边为假,右边不执行
|| :短路或
如果左边为加,右边执行,如果左边为真,右边不执行
三元运算符
关系表达式? 表达式1:表达式2;
数组
初始化
- 静态初始化
数据类型[ ] 数组名 = {数组元素}; - 动态初始化
数据类型[ ] 数组名 =new 数据类型[数组长度];
数组的索引从0开始
方法的重载
同一个类中,方法名相同,参数列表不同即可方法重载
面向对象
-
类和对象的理解
类:类是对事物的一种描述,类中包括了事物的一些共有的属性和行为
对象:对象是具体存在的事物,是类实例化的一种体现 -
封装
private关键字
封装是用privat来修饰成员,封装使得外部无法随意对类的成员变量赋值或者调用成员变量,保证了一定的安全性,把代码用方法进行封装,提高了代码的复用性
this关键字
当成员变量和局部变量重名是,使用this关键字来修饰成员变量,this指代当前对象
this就是一个对象
1.成员方法中的this就是调用当前方法的对象
2.构造器中的this,就是当前new的对象
构造器
构造方法的作用是用来创建对象
完成对象的初始化
创建类是或默认赠送一个无参构造,也可自定义有参或满参构造,只要自己定义了就不会附赠无参构造
对成员变量封装
1.使用private关键字修饰成员变量
2.给私有的成员变量提供访问方法:getter,setter
String类
创建字符串对象的两种方式的区别
- 通过构造方法创建
通过new创建对象,每次new都会申请一个内存空间,虽然内容相同,但是地址不相同 - 直接赋值
直接赋值,无论在代码中出现多少次,JVM都只会建立一个String对象,并在字符串池中维护
字符串的比较
比较基本数据类型:比较具体的值
比较引用数据类型:比较的是对象的地址
具体值的比较用**==号**
字符串的额比较用equals方法
StringBuilder类
- StringBuilder是一个可变的字符串类,我们可以把它看成一个容器,其中的内容是可变的
StringBuilder类的构造方法
- public StringBuilder()
- public StringBuilder(String str)利用此方法可将字符串转换为StringBuilder
StringBuilder与String的转换
- StringBuilder可以利用toString()方法
- String利用带参数构造方法就可以
ArrayList类
- 底层是数组实现的,长度可以变化List item
- 使用泛型约束集合中存储的元素的数据类型
成员方法
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定的元素,返回删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public E size() | 返回集合中的元素的个数 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
匿名对象
概念:没有名字的对象就是匿名对象
一次性使用,不须用对象名接收
格式: new 类名(参数)
继承
-
面向对象的三大特性:封装,继承,多态
【概念】
用一个子类继承父类,子类就能拥有父类的成分
【好处】
1.提高代码的复用性
简化代码,多个勒种重复的成分定义到父类,子类只要定义特有的成分
2.让类与类之间产生is a的关系,是多态的前提
注意:
1.继承一定是两个类之间的关系
2.子类继承父类后拥有父类的成分
3.java中只支持单继承 -
子类中不能继承的成分
1.私有化的成员变量,可以继承但不能直接访问, 需要借助getter,setter方法
2.构造方法无法继承到子类,但可以使用
- 继承后的特点
- 【成员变量】
子类和父类中的变量没有冲突的, 子类可以直接使用父类的非私有成分
如果有冲突,优先访问本类,如果没有在访问父类
当方法中的局部变量,本类中的成员变量,父类中的成员变量冲突了,解决方案
1.局部变量是直接访问的
2.本类的成员变量是借助this
3.父类的成员变量是借助super
-
【成员方法】
成员方法的访问同成员变量 -
【构造器】
1.不会继承到子类中,但子类可以使用父类的构造方法
2.如何访问
1)只能在子类构造方法的第一句进行访问(默认存在一个父类的无参构造)
【如何使用】
借助super关键字
【小结】
this和super使用小结 -
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
-
super() 和 this() 都必须是在构造方法的第一句,所以不能同时出现。
-
super(…)和this(…)是根据参数去确定调用父类哪个构造器的。
-
super(…)可以调用父类构造器初始化继承自父类的成员变量的数据。
-
this(…)可以调用本类中的其他构造器。
方法的重写
快捷键ctrl+O
【注意事项】
- 方法重写是发生在子父类之间的关系。
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
一般的做法就是保证权限一致,
public > protected > [缺省] package-private > private - 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
重写参考规则:方法声明不变,方法体逻辑重新实现。
抽象类
概述
抽象方法:只有方法的声明,没有方法的具体实现
抽象类:一种特殊的类,可以包含抽象方法
【关键字】 :abstract 表示抽象
- 【注意事项】
1.非抽象类不能有抽象方法
2.抽象类不能创建对象,需要子类继承,由子类创建子类对象
3.子类要重写抽象类的抽象方法,如果没有重写抽象类的全部抽象方法那么子类也必须是抽象类 - 抽象类的存在意义
1.为子类提供一个模板,父类中有的抽象方法一定要实现,或者自己也变成抽象方法
2.为子类提供一种约束,一种模板
设计模式:模板设计模式
- 1.设计模式:某一种特定需求的最佳代码实践。这种代码是一种通用的思想,从而提炼成为一种模式。
- 2.在定义模板方法时,将不确定的逻辑定义成抽象方法。让子类具体去实现。
- 3.可以看出,模板模式的优势是,模板已经定义了通用架构,使用者只需要关心自己(子类)需要实现的功能即可!非常的强大!
Static关键字
- 被static修饰过的成员,成为类成员,随着字节码文件的加载到内存而存在。
- 没有被static修饰过的成员是属于对象的成员, 随着对象被创建而存在。
静态变量
- 静态变量也叫类变量,成员变量被static修饰过后就是类变量,类变量被所有的该类对象所共有。
- 静态变量的使用
静态变量可以直接被类名调用,也可以被该类对象调用(建议使用类名直接调用)
格式:类名.静态变量
静态方法
类方法也称静态方法
定义格式: public static 返回值类型 方法名(参数列表){方法体}
- 调用方法
同静态变量调用,推荐类名直接调用
注意事项
1.静态方法只能访问该类的静态变成员
2.静态方法中不能存在this
3.非静态方法可以访问所有成员
权限修饰符
- public
公共的,本项目中任何地方都可访问 - protected
受保护的,同一个包中或者不同包的子类可以访问 - 缺省(package-private)
包私有,只能在该包中访问 - private
私有的,只能在本类中访问
使用特点
- 类的权限
只能使用public ,或者包私有 - 成员变量
根据需要而定 - 构造方法
一般使用public,也可根据需要而定,如工具类的构造方法使用private修饰 - 成员方法
一般使用public修饰,也可根据自己需求而定
final关键字
final关键字也是修饰符,表示最终的。可以用来修饰类,方法,变量
- 修饰类,类就不能有子类
- 修饰方法,子类不能重写
- 修饰变量,变量就称为常量,只能赋值一次。
代码块
类中方法外
-
构造代码块
在类中方法外出现的一种代码块,用于辅助对实例进行初始化
构造代码块会在每次构造方法执行前执行一次 -
静态代码块
静态代码块,用于类加载到内存后,对类的静态成分进行初始化
在类加载到内存后,执行一次,类加载到内存只会执行一次,静态代码也只会执行一次 -
局部代码块
在某些局部位置,方法内,构造方法内,构造代码块内,静态代码块内的{}就是局部代码块
接口
-
** interface关键字**
接口也是一种引用数据类型,类中可以定义各种成分(属性,构造方法,成员方法,常量……)接口主要用来定义方法,也可以用来定义 常量。 -
接口可以定义的方法
1.在JDK7以前,只能定义的抽象方法
2.在JDK8开始,新增了默认方法,静态方法
3.JDK9开始,新增加了私有方法 -
接口中定义常量
默认就是公共的,静态常量,直接接口名调用即可
public static final 类型名 常量名 = 值 -
接口的抽象方法
-
接口没有构造方法,而且接口是抽象的,接口不能直接实例化对象(类似于抽象类)。
-
使用时需要定义一个子类去实现接口(实现类似于继承意义是一样的)
-
实现所用的关键字:implements (意义与extends一样的可以表示继承)
-
接口是支持多实现
【抽象方法的使用】
- 如果接口中存在抽象方法,子类实现接口的时候需要将所有的抽象方法重写,否则子类需要变成抽象类。
- 默认方法
默认方法不是抽象的,是具体的,需要借助default关键字 - 默认方法的使用
- 默认方法在接口中,不能创建对象使用,只能依靠子类来使用
- 子类实现含有默认方法的接口,可以对默认方法进行重写,也可以直接继承使用
- 静态方法
- 和类中的public静态方法是一样
- 直接用接口名调用
接口的多实现
- 类可以继承一个父类同时实现多个接口,注意:继承要写在实现的前面
public interface A{}
public interface B{}
public class C{}
public class D extends C implements A,B{}
【在多实现中方法使用注意】
- 如果多个接口中存在多个抽象方法,要重写所有的抽象方法。相同的重写一次
- 如果多个接口中存在多个默认方法,默认方法可以重写,也可以直接使用,如果有相同必须要重写。
- 静态方法,私有方法和子类没有关系,不会冲突。
父接口和父类方法优先问题
结论:如果一个类的父类和父接口中存在有相同的方法,优先使用父类的方法
原因:父类会通过子类去重写父接口的方法
接口的多继承
-
类和类:继承 extends 【单继承】
-
类和接口:实现 implements【多实现】
-
接口和接口:继承 extends 【多继承】
-
接口的多继承相当于 将多个父接口的功能集中在子接口中。
【使用注意】
当多个父接口中存在相同默认方法时,子接口一定要进行重写
多态
多态:多种形态
- 同一个方法不同具体类型执行会有不同的结果体现
- 对象也可以有多型
多态的前提
- 继承或者实现【决定性条件】
- 需要使用父类型接收子类对象【格式体现】
- 方法的重写【意义体现】
多态的害处和弊端
- 好处
利用父类型接受子类对象的特性,可以设计一个扩展性强的方法,做形参可以接收任意子类传入的对象。做返回值亦如此 - 弊端
无法调用子类特有方法
多态代码中,只能执行父类型中存在的方法,如果调用了方法,使用的是子类中重写的方法,如果子类没有重写,动态向父类中查找
接口多态
- 接口多态和继承多态用法一样。格式上的区别在于使用父接口接收子类对象。
内部类
成员内部类
当描述一个事物时,内部还有一个事物需要描述。
例如:汽车和引擎,人和心脏
【成员内部类的访问】
访问特点:
- 成员内部类是可以直接访问外部类所有成员(包含私有的)
内部类默认存在一个外部类对象(外部类.this) - 外部要访问内部类,就必须建立内部类对象
从外部访问内部类成员
如果要访问成员内部类的成员,一定要创建对象
创建内部类对象的格式:
外部类名.内部类名 对象名 = 外部类对象.new 内部类();
匿名内部类
如果要写匿名子类,一定要先提供一个父类或者父接口。
new 父类/父接口(){
//如果父类型有抽象方法,强制要重写所有的抽象方法
};
格式:
- 体现了一个对象,这个对象就是该父类型的子类对象
- 体现了一个类,要求重写父类型中所有的抽象方法