“首先,此知识点整理完全是出于个人复习用的, 可能有很多地方写的不详尽导致只有我自己知道什么意思, 再加上技术不过关的原因, 可能还有很多地方有纰漏而自己没有看出来, 望各路大佬口下留情, 如有错误, 还请指出纠正, 谢谢大家!”
——咕咕咕
Java知识点整理(一)
——计算机学院网络1801张恒
1.Java概述:
三个版本 标准版JavaSE 企业版JavaEE 微型版 JavaME
Java特点: 平台无关性(可移植), 面向对象(代码重用), 解释性(源程序生成字节码), 简单健壮(不需要进行指针运算和存储器管理)。 安全, 多线程, 分布式, 动态性, 高性能。
运行Java文件, jdk是必选的, 而ide是可选的, 高级ide是为了方便程序员写代码。
类名可以用中文, 但是不推荐。
编译Java程序会生成同名的.class文件, 这是一个字节码文件。
运行程序就是运行的class文件。
同一个源文件中, 只能含有一个标记为public的类, 哪个是public, 哪个类名就必须和这个类的名字相同。
Main函数通常放在public类中, 是通常, 而非一定。
源文件中有多个类同时存在, 那么每个类编译完过后会生成各自的字节码文件。
Jre包含在jdk内, jvm负责解释字节码, 将jvm指令换成真实机器指令。
Jar文件时Java文件封装的最小单元, 类似zip和rar文档。
2.Java编程基础:
标识符的概念, 开头不能是数字, 而且标识符不能是关键字和保留字:if class goto。
关键字(51)和保留字(2个 goto, const)(注意)
每一种类型数据的字节长短,ex:char C++中为一个字节, Java中就为两个字节。
Var关键字用来声明局部变量, 也是定义时需要初始化, 不可中途改变类型, 类成员变量, 方法参数, 返回类型不可用var。
数据类型中额外注意其中的复合类型:
字符串, 数组, 类, 接口。
运算符的注意。注意%Java中可用于浮点数运算。
浮点数除以0返回特殊值, 浮点数判断相等用差值小于临界值判断。
整数运算溢出问题, 就像Java题库中的一道选择题, 我们对他具体分析, 可以举-2 -1 0 1 2 3 这样的例子进行带入分析即可。
整数移位运算, 记住>>>是无符号位移, 无论正负高位都补0, 不可以用于字符串。
输出格式的控制最好用String.format 比如其中的%-5d就是表示这个数字不足5位宽的时候在右边补空格凑齐。
变量必须经过初始化才可以使用。
数字值不可以自动转换为boolean
字符检测方法中返回值为true或者false
String不是原始类型, 而是一个class类型。
字符串与其它类型做+运算时, 自动将其它类型转换为字符串。
CharAt没找到返回-1
Equals和==字符串比较的异同。
S.compareTo(t), t大的话返回正值。
Substring注意下标范围。
Trim去掉前后空白字符, 字符串变为数值Integer.parseInt()
数值转换为字符串为Integer.toString(value)
String str = “123”;
System.out.print(str[1]);
这样是错的
Char数组变成String可以String str = new String©
StringBuffer和StringBuilder 后者去掉线程安全少了开销。
3.数组
数组声明不能创建对象本身, 而是创建的一个引用, 通过这个来引用数组。
Int []a = new int[]{1,2,3,4,5} 后面不可以指定元素个数
For - each 循环
可变参数(只可以出现在参数列表的最后)
可变参数可以当作数组来处理, 用于参数个数不确定, 但是类型确定的情况
二维数组的行数用arr.length 列数用 arr[0].length来写
Arrays工具类的使用
4.类和对象:
类是对象的模板, 对象是类的实例
一个class里面可以有多个main(重载)
编译程序javac
Java没有析构函数。
构造函数前面一般写的是public
创建新对象时, 数值型数据默认为0, 浮点则为0.0
Boolean 默认为 false
Char 则为0, 为空字符
所有引用型变量如String则为null
构造函数无任何返回值, 不指定类型, 一般前面加上public
重载:
名称相同, 参数表不同, 返回类型的不同或者方法的修饰符不作为重载的判断依据
可以在构造函数中调用构造函数, 但是只可以调用一次, 而且构造函数的调用必须排在第一位, 使用this调用, 不可以直接使用类名
This()仅在类的构造方法中使用,且必须时整个构造函数的第一个可执行语句
Java类中不可以实现多继承是为了安全, 抽象类和非抽象类都有
非抽象类的方法, 当类可以多继承的时候, 被继承的不同的父类可能会有同名同参的方法, 子类没有重写的话, 子类调用的时候就会出现冲突。
5.Static, final和访问控制
Static关键字用来声明成员属于类, 而不是属于类的实例, 在他的类的任何对象创建之前被访问, 而不必引用任何对象
静态方法只可以调用其它的静态方法, 只可以访问static数据, 不可以用任何方式引用this和super。
静态变量只分配一块存储空间
静态块代码只会被初始化一次, 而且在类被第一次装载的时候, 按照他们在类中出现的顺序来执行,(构造代码块和静态代码块)
Final类不可以被继承, Java.lang.String/Math就是一个final类
Final方法可以被继承, 但是不能被覆盖。
Final变量定义的时候可以先声明, 不给初值, 但是使用前要被初始化, 作为参数也只可以读取而已。
访问控制权限的排序
声明包
Import examples.ch1.A
Java 常用包中都有哪些核心类
6.继承
继承的主要目的是代码重用, 用关键字extends来实现继承了, 为了更好的封装性, 父类属性建议用protected修饰
Private, final和static方法都不可以被覆盖, 因为当他们标记为private或者static的时候就已经被默认标上final了
子类可用通过super调用父类中被覆盖的方法。
Java只支持单继承, Object类是所有类的父类, 语言包中
新类中的方法如果除了代码实现的部分和父类中的不同,其它的什么都相同, 那么就可以产生覆盖
只有非private方法才可以覆盖
不能缩小覆盖方法的访问权限, 不能抛出比原方法更多的异常
当父类中方法是非private的时候, 我们可以用super来直接引用访问, 或者super()来调用父类构造函数, super()必须是第一个可以执行的语句, 而且仅仅在子类的构造方法中使用。
如果没有显示用super调用父类中的构造函数的话, 那么将用父类中的默认构造函数, 若父类中不能用默认的话, 那么将导致编译错误
7.多态、抽象类、接口和内部类
一个对象如果可以指向其它不同类型的对象, 那么这个对象就是多态性的, 主要体现继承过程中的动态调用问题, 一个对外接口, 多个内在实现方法。
多态是为了降低系统的耦合度, 提高程序的可拓展性。
通用统一的接口, 实现调用不同的功能。
-就算是多态,父类类型对象也只可以访问子类中和父类有关的方法, 如果子类中有除了父类中心的方法, 那么也是不可以访问的。
可以通过强转来恢复子类对象的功能
Father fa = new son();
If(fa instanceof son){
son s = (son)fa;在这里插入代码片
s.sonmethod();
}
多态分为两种:
静态多态:编译时就知道要用什么函数, example(重载)
动态多态:运行时才知道, 比如继承中的覆盖方法。
Private方法不可以被覆盖, 不属于多态。
多态中equals方法的实现:
public boolean equals(Object o){
if(o instanceof Person){
person p = (Person) o;
return ...
}
return false;
}
含有抽象方法的类必须被声明为抽象类
如果子类没有覆盖父类的所有抽象方法, 那么子类还要声明为抽象类。
抽象类也可以有自己的构造函数, 但是不可以声明为抽象的。
抽象类不可以用new去产生对象, 也就是不可以放在等式的右边。
(因为只提供一个类型的部分实现)
抽象类中并非都是抽象方法, abstract方法只需声明, 不需实现。
Abstract不能与private, static, final方法并列修饰一个方法, 因为不可以被继承或者覆盖
接口是一种特殊的抽象类:
接口中所有方法都是抽象的, 由子类全部实现, 不同的子类可以实现不同的功能。
如果一个类没有全部实现某个接口的方法, 这个类必须被声明为抽象的。
在接口当中, 方法默认是公有且抽象的, 即public abstract的
用implements实现接口。
接口也可以添加default或者static方法, 但是添加到接口中的时候必须在接口中已经实现了方法, 这样做的好处是给接口新增一个方法的时候子类不必全部修改。
前者可用抽象类对象调用, 但是static中只可以用抽象类类名来进行调用。
接口中的常量为public static final 类型, 且必须被显示初始化。
枚举类中的构造函数是私有的。
Java只支持单继承, 但是一个类可以实现多个接口, 用,隔开即可, 间接的实现了多继承。
接口不能有构造函数, 因为全部都不能实例化,接口中的方法必须是public类型, 而且不可以包含静态方法, 没有方法体。
一个类可以实现多个接口, 继承多个其它的接口, 但是一个接口不能实现另一个接口。
Extends关键字必须在implements之前, 在继承父类的时候同时实现一个或者多个接口的注意事项。
接口也不可以在等式右边。
内部类(嵌套类)
内部类和平常类没有太大的差别, 也是有构造函数之类的。
编译了过后 正常类为Outer.class 而内部类为Outer$Inner.class
其它类使用普通内部类
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
Outer.Inner inner = new Outer().new Inner();
同名变量问题
public class Outer{
private int size;
public class inner{
private int size;
public void stuff(int size) {
size++;
this.size++;
Outer.this.size++;
}
}
}
在内部类的方法中定义内部类, 其中方法的局部变量为final才可以被内部类访问(final可以省略, 会自己默认出来为final)
Outer$1Inner.class 1为在第一个方法中定义的内部类。
通常一个类不可以声明为静态的, 但是只有一个内部类才可以
如果是静态内部类
Outer.Inner inner = new Outer.Inner();
(记得与前面的作比较)
内部类可以访问外包类中的static或者实例成员变量, 内部类可以是抽象类或者接口, 如果是接口, 可以由其它内部类来实现, 可以使用全部的四种访问权限控制。
当一个内部类被声明为static类型的时候, 这个时候它就变成了顶层类, 相当于把它放在了外面, 不是嵌套的内部类了, 而且他的对象中将不包含指向外包类对象的指针, 所以不可以再引用外包类对象了。
只有顶层类才可以声明static成员, 内部类想要的话那么内部类必须声明为static才可以。
匿名类(只可以使用一次, 不能在其它地方引用, 不可实例化 ,无构造函数, 利用父类的构造函数和自身类体构造成的类。父类可以是类, 抽象类或者接口。
编译类名为test$1.class 数字是匿名类序号值。
匿名类是一个内部类, 而且不可以是static的, 不可以是抽象的, 必须要实现继承的类或者接口的所有抽象方法, 是隐式的final
C++虚函数等于Java普通函数。
C++纯虚函数等于Java抽象方法。
C++抽象类等于java抽象类。
C++虚基类等于java接口。