Ⅰ:基础篇
1:java的发布
java发布晚于C++,在许多内容上十分接近C++;2:java的就业方向
- Web开发
- Android开发
- 客户端开发
- 嵌入式应用
3:java跨平台性
源代码在编译后变成后缀名为 .class 的文件,然后通过 java虚拟机(JVM) 作为媒介,在不同的平台上运行;因此作为"红娘"的 JVM 是不能跨平台的而 .class 是可以跨平台的;4:java的版本
- J2SE(Java SE) 标准版(Java学习入口)
- 主要用于开发客户端J2EE(Java EE) 企业版
- 功能最丰富,常用于web开发与庞大的管理软件,符合企业的需求J2ME(Java ME) 微型版(Java的初衷)
- 主要用于嵌入式和移动开发
5:导入java类文件
- import 包名.类名 //导入具体包中的具体类
- import 包名.* //导入具体包中的全部类
6:不同进制的表示方法
- 二进制:0b
- 八进制:0
- 十六进制:0x
- 例如:011 就是八进制的11,相当于十进制的9;123_456_789 也表示123456789,java编译器会删除下划线,但是增加的代码的可读性
7:数据类型的转换
- 自动类型转换
从左往右,逐渐转换byte,short,char-int-long-float-double - 强制类型转换
在数据前加括号,括号里写上目标类型;如:(int)3.14 ,转换后变成3;
8:运算符
int b = 10 ; int a = b++; //此时a = 10;b = 11;a = ++b; //此时a = 11;b = 11;
9:大量数据下StringBuffer类与StringBuider类 对 Sting类的强势碾压
- StringBuffer
该类的方法侧重于对字符串进行操作,在对大量字符串进行操作时优势明显,多线程安全- 声明方法: new StringBuffer()//分配16字节长度的缓冲区 或 new StringBuffer(num)//分配num字节长度的缓冲区 方法:
- append(内容) //往当前字符串后添加内容
- deleteCharAt(num) //删除字符串中指定num下标的字符;也可以用(num1,num2)删除[num1,num2)之间的字符
- insert(num,"内容") //在指定位置添加内容
- setCharAt(num,'另一个字符') //把指定的下标的字符替换成另一个字符
- StringBuilder
与StringBuffer类似,但速度相对来说更快,但是线程不安全,建议在单线程下使用
10:java中创建对象时的运行顺序
- 从main方法作为入口
- 在遇到new时执行类的构造方法的签名
- 初始化类的属性
- 执行构造方法的代码块
- 回到main方法中的下一行
11:包装类
- 基本数据类型与对应的包装类
- byte -- Byte
- short -- Short
- int -- Integer
- long -- Long
- char -- Character
- float -- Float
- double -- Double
- boolean -- Boolean
装箱与拆箱 - int num = 10; Integer n = new Integer(num); //将基本数据类型变为包装类称作装箱;
- int m = n; //将包装类变成基本数据类型称为拆箱;
12:源文件
- 只能有一个public类,可以有多个非public类
- 定义在某个包中时,package语句在首行
- import语句在package之后,在类定义之前
- package与import对源文件中的所有类都有效
13:package包
- 层级表示
- 目录的层级表示: '/' 例:D:/Java
- 包中的层级表示: '.' 例:pack.pac1.Test 相当于目录中的/pack/pac1/Test.class
包的调用 - 用new关键字调用时,需要在方法前添加完整的包名
例如:java.util.Date day = new java.util.Date() ; // - 通过import引入包中的类,使用'*'可以引入具体包中所有的类
访问权限 - public : 公共的
- private : 只能在本类中使用
- 无修饰符 : 只能在本包中的类访问
14:继承
- 类继承
- extends关键字
- 子类可以调用父类的属性
- 子类可以重写(覆写)父类的方法
- 构造方法不能被继承
super关键字 - 与this关键字类似,this表示当前类的实例,super表示父类
- super.方法名() 可以调用父类中的方法
- 构造方法中可以用 "super(参数);" 来调用父类的构造方法;如果编写子类的一个构造方法而未用super,编译器会自动插入一个不带参数的调用父类构造方法的方法;
方法的覆盖 - 覆盖父类方法的返回类型,方法名称,参数列表必须与原方法相同;
- 被覆盖方法不能有 final,private,static 关键字
15:多态
- 三个必要条件
- 存在继承
- 存在重写
- 父类变量引用子类实例
多态的本质
假设:
People student = new Student();
student.func(num); -
- 编译器会列举出Student类中所有的func方法和父类 Peoole中访问修饰符为 public 的 func方法
- 重载解析:通过传入的参数类型与数量对方法进行筛选,挑选出满足传入参数标准的方法;如果没有找到,会进行自动类型转换后继续查找,如果依旧无法匹配,报错
- 通过静态绑定或动态绑定对找到确切的方法(动态绑定,静态绑定)
- But:为了增加速度,JVM提前为每一个类都创建了一个方法表,便于查找,增加了调用时的速度;
instanceof运算符 - 可以判断一个变量所引用的对象的实际类型,但它表示的是引用的对象的类型,并不是变量自身的类型
- 所有的对象 instanceof Object 时,都会返回true
- 当前对象 instanceof 当前类/父类 时,会返回true
多态对象的类型转换 - 向上转型是子类转成父类;向下转型是父类转成子类;
- 向上转型:通常用到的父类变量,子类对象,这个过程就是向上转型
- 向下转型:有时为了调用子类的功能,完成父类没有办法做到的事情,我们就需要向下转型;但是向下转型不能直接父类对象强制类型转换成子类,必须先向上转型,然后强制类型转换成子类
- 因为不正常的向下转型会通过编译,但是会运行失败,因此需要通过 instanceof 运算符进行判断,如果父类是子类的实例(向上转型),那么可以转换成子类,否则不可以执行转换;
16:静态
- static关键字与静态方法
- static在类被装载时会被初始化,并且共享这块内存
- 静态方法只能访问静态变量
- 静态方法也可以通过对象来访问,但会爆出警告
- 静态方法不能被非静态方法覆盖
- 构造方法无法声明为static
- 局部变量不能声明成static
- 静态方法中不存在当前对象,因此不能使用this关键字与super关键字
静态初始器与导入 - 静态初始器: static{ 代码 } //在类装载(第一次使用)时执行一次,可以初始化静态变量
- 静态导入:导入静态类或静态方法,用: import static XXX 来导入静态类/方法,在使用导入的方法时也可以直接使用方法名调用;
17:final关键字
- final修饰后的特点
- 类:不能继承
- 方法:不能覆写
- 变量:成为常量,只能赋值一次,变量名称按照惯例全部大写
其他知识点 - static 与 private 修饰过的方法会被隐式声明为 final
- 因为final修饰的方法为静态绑定,因此不会产生多态,在程序运行时可以提高效率,但经过优化的JVM在内联等方面依旧存在优势
18:Object类
- 特点
- 定义java类时名有明确的继承,则会默认extends Object;
- 除了基本类型外,其他的(包括基本类型数组)都是对象,继承Object类;
方法 - equals() //判断一个对象是否等价于另一个对象,只能比较引用类型
- hashCode() //两个对象相同,则他们的hashCode值相同;但两个hashCode值相同的对象不一定是相同的对象;
- toString() //默认下会返回当前对象的类型和内存地址,可以在类中进行覆写来得到更加有用的信息