目录
Java基础及高级
Java的特点
-
Java是面向对象语言(oop)
-
Java语言是健壮的。 Java的强类型机制,异常处理,垃圾的自动收集
-
Java是跨平台的(编译好的.class文件可以在多个操作系统上运行,根本原因是JVM)
-
Java语言是解释型的(解释性语言有js,PHP,Java,编译性语言有c/c++)
区别是解释型语言编译后的代码不能直接被机器执行,需要解释器来执行,编译性语言编译后的代码可以被机器执行)
面向对象基本概念(oop)
- 面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为。
- 类是面向对象中的一个很重要的概念,因为类是很多个具有相同属性和行为特征的对象所抽象出来的,对象是类的一个实例。
- 类具有三个特性:封装、继承和多态。
- 封装性:指把对象的属性和行为看成是一个整体,并把不需要外界知道的信息屏蔽起来
- 继承性:在基础的类上派生出反应特殊事物的类
- 允许程序出现重名
继承性(extends)
- 继承可以解决代码的复用,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类。子类就会拥有父类的属性和方法
- 父类又叫超类,基类
- 子类又叫派生类
- 子类继承了所有的属性和方法,非私有属性子类可以直接访问,私有属性不能在子类直接访问,要通过父类提供的公共的方法去访问
- 子类必须调用父类的构造器,完成父类的初始化,之后才会进行子类的初始化
- 当创建子类对象时,不管使用子类的那个构造器,默认情况都会去调用父类的无参构造器,如果父类没有无参构造器,则必须在子类的构造器中用super、去指定使用父类的哪个构造器完成对父类的初始化功能。
- super()必须放在构造器的第一行,并且只能在构造器中使用
- super()和this()都只能放在构造器第一行,因此两个方法不能共存于构造器
- java的所有类都是Object类的子类
多态性
- 对象多态体现为父类引用变量可以指向子类对象,前提条件是必须有子父类关系
- 一个对象的编译类型和运行类型可以不一致
- 编译类型:声明该对象时使用的类型,不能改变
- 运行类型:实际赋给该变量时的类型,可以改变
- 编译类型看 = 左侧,运行类型看 = 右侧
- 向上转型(自动转换):
- 本质是父类的引用指向了子类的对象
- 可以调用父类的所有成员
- 不能调用子类的特有成员(由编译类型决定)
- 最终运行看子类的具体实现
- 对象向上转型的意义是在于参数的统一,向下转型指的是调用子类的个性化操作方法
- 向下引用(强制转换)
- 语法:子类类型 引用名 = (子类类型)父类引用
- 当向下转型后,可以调用子类类型中所有成员
- 属性值没有重写,属性的值看编译类型
- 方法先看运行类型
- Java的动态绑定机制:
- 当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
Java运行机制及过程
- Java的核心机制-Java虚拟机(JVM)
- JVM是一个虚拟的计算机,具有指令集使用不同的存储区域,负责执行指令,管理数据,内存,寄存器,包含在JDK中
- 对于不同的平台,有不同的JVM
- Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处执行”
test.java - (编译 javac 使用开发工具) > test.class - (运行 java) > JVM for Mac/Windows/Linux
- Java编译:
- 通过编译器(javac)将java源文件编译成JVM可以识别的字节码文件(.class)
- 通过javac编译工具对test.java文件进行编译
- Java运行:
- 有可执行的java程序(字节码文件)
- 通过运行工具java.exe对.class文件进行执行
Java数据类型
- 数据类型分为基本数据类型和引用数据类型(类,接口,数组)
- 基本数据类型
数据类型 | 大小/位 | 可表示的数据范围 | 默认值 |
---|---|---|---|
byte | 8 | -128~127 | 0 |
short | 16 | -32768~32767 | 0 |
int | 32 | -2 `31~2 31-1 | 0 |
long | 64 | -2 63~2 63-1 | 0 |
float | 32 | -2 `31~2 31-1 | 0.0 |
double | 64 | -263~2 63-1 | 0.0 |
char | 16 | 0~2`16-1 | |
boolean | 8 | true false | false |
-
关于浮点类型:
- 浮点数在机器中存放形式为:浮点数= 符号位+指数位+尾数位 其中尾数位容易丢失造成精度损失 所以可以理解为小数都是近似值
- 浮点数默认为double,通常使用double
- 当进行判断两个浮点数相等时应该将两个浮点数的差值的绝对值,在某个精度范围内来判断
- 引用数据类型
- 堆内存(heap):保存每一个对象的属性内容,需要使用new语句来开辟,如果一个对象没有堆内存指向,则无法使用
- 栈内存(stack):保存的是一个堆内存的地址,可以理解为对象的名称
- 只要是引用数据类型,就需要使用new并创造一个新的堆内存
- 引用传递:一个堆内存可以被很多栈内存指向并修改
关键字
this关键字
- this可以完成三件事 调用本类属性,调用本类方法,表示当前对象。
- 调用本类属性:this.属性
- 调用本类方法:
- 调用本类普通方法:this.方法()
- 调用本类构造方法:this(); 如果构造方法有参数:this(参数);
- 使用this调用构造方法时要放在第一行
static关键字
- 如果类中的某个属性希望定义为公共属性(所有类都可以使用的属性),则可以在声明前加上static
- static的属性将成为公共属性(公共数据区),任何一个对象修改此属性都会影响其他对象
- static和非static属性的区别:非static属性必须要有实例化的对象才能进行访问,static属性不受实例化对象的控制
- 优先考虑非static属性
- static方法不能直接访问非static属性或方法,只能调用static属性或方法
- 非static方法可以直接访问static方法或属性
- static方法可以直接通过**类名.方法()**名访问
- **类变量:**是该类的所有对象共享的变量,任何一个该类的对象访问它时,取到的都是相同的值。
- 定义:访问修饰符 static 数据类型 变量名
- 访问方式:类名.类变量名 or 对象名.类变量名
- 类变量是随着类的加载而创建,所以即使没有创建对象也可以访问
- 类方法:又叫静态方法,访问一个对象方法,需要有一个对象来访问方法,而类方法只需要 **类名.方法()**即可访问
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区,类方法中无this
super关键字
- super代表父类的引用,用于访问父类的属性,方法,构造器
- 可以访问父类的属性/方法,不能访问private属性/方法 (super.属性/方法)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBXRlCHT-1635595615537)(D:\Typora\picture\QQ截图20211004125106.png)]
final关键字
- final称为终结器,可以使用final定义类,方法,属性和局部变量
- 使用final定义的类不再有子类
- 使用final定义的方法不能被子类覆写
- 使用final定义的变量就成为了常量,常量要在定义的时候设置好内容,并且不能修改(final常量要大写)
- final使用注意事项
- final修饰的属性由叫常量,用xx_xx_xx_xx
- final修饰的属性在定义时,必须赋初值,并不能修改
- 赋值的位置是:
- 定义时
- 在构造器中
- 在代码块中
- 如果final修饰的属性是静态的,那么赋值的位置
- 定义
- 在静态代码块
- 如果类不是final类,但是含有final方法,则该方法不能重写,但是可以继承
- 如果一个类是final类,则不需要将类的属性定义为final(画蛇添足)
- final不能修饰构造方法
- final和static搭配使用,效率更高,不会导致类的加载
- 包装类(Integer,Double,Float,Boolean等都是final),String也是final
常用内存区间
- 栈内存空间:保存所有的对象名称(保存引用的堆内存空间的地址)
- 堆内存空间:保存每个对象的具体内容
- 全局数据空间:保存static类型的属性
- 全局代码区:保存所有的方法定义
- 对象存在形式:基本数据类型存放在堆 引用数据类型内容存放在方法区
- jvm内存方法的调用机制:
- 当程序执行到方法时,会开辟一个新的栈空间用来保存此方法
- 当方法执行完毕,就会返回到调用方法的地方
包(package)
-
包的本质就是创建不同的文件夹来保存类文件
-
包名小写,只能包含数字,字母,下划线,不能用数字开头
-
包的作用
-
区分相同名字的类
-
当类很多时,可以很好的管理类
-
控制访问范围
-
-
package语句用来声明当前类所在的包,需要写在class的最上面,一个类中最多只有一句package
-
import语句放在package下class上
##访问修饰符
- Java提供了四种访问控制符号控制方法和属性的访问权限
- 公开级别:用public修饰,对外公开
- 受保护级别:用protected修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开
- 私有级别:用private修饰,只有类本身可以访问,不对外公开
覆写(override)
- 子类定义了和父类的方法名称,返回值类型,参数类型及个数完全一致的方法时就叫方法的覆写
- 被子类所覆写的方法不能拥有比父类更严格的访问控制权限(public > default > private)
- 子类定义了和父类完全相同的属性名称时,称为属性的覆写(没有开发意义)