第八章
一.JDK.JRE.JVM关系?
JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK(包括了Java运行环境JRE、Java工具和Java基础类库。)中包含JRE(是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。)和JVM(Java虚拟机),在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
运行java程序只需要jre就可运行,而开发需要jdk.
二.Object类。
1.是所有Java的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。
2.equals
==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。
(比较地址值即是指是否为同一个对象的引用)
equals()是一个方法,只能比较引用数据类型(String)。重写前比较的是地址值,重写后比一般是比较对象的属性。(若想比较新的引用数据类型,需自己重写equals方法)
三.数组
1.什么是数组?
是有序的元素序列,用于储存多个相同类型数据的集合,每个元素通过下标访问。
2.特点
2.1 长度必须确定,一旦创建,大小不可变。
2.2 元素必须是相同类型
2.3 数据类型可以是任何,包括引用数据类型。
3.数组声明但没赋值
char[] ch = new char[3];//默认空格
int [] Int = new int[2];//默认0
String[] strings = new String[2];//默认null
Byte x;//默认null
4.数组初始化方式
动态初始化:在每次创建对象时都要调用一次
静态初始化(静态初始化块只调用一次,是在类被第一次加载到内存时,并非要创建对象才执行。):
int[] a={8,9,10}; //写法一,声明一个长度为3的int类型数组,分别是8、9、10;
int[] a=new int[]{8,9,10}; //写法二(使用了边声明数组边赋值的方法,就不能在[]内定义长度。)
数组初始化都把空间分配好了,不会再改变。
5.数组的遍历
int[] a= {2,4,4,3};
for(int m:a)
System.out.println(m);
6.多维数组
7.实例:
Int[] gang={12};
Int[] ming=gang;
如果改了gang,ming也会跟着变,因为堆内存只有gang new出来的一个内存(数组A,B引用的相同数组)
8.三种数组复制方法:
1.通过for循环遍历
2.System.arraycopy(1.源数组,2.源数组复制起始位置,3目标数组,4目标数组起始位置,5复制的元素个数);
3.int[] arr=Arrays.copyOf(nums, nums.length);
// 与System.arraycopy相比此方法在原有基础上还可以扩容或者缩容,而System.arraycopy不能改变数组容量
9.数组排序:
Arrays.sort(nums);//只提供了升序排序的功能
如果想降序输出,用先排序好,再用for循环
四.抽象类
1.什么是抽象类?
是一个模版模式,为所有子类提供一个通用模版,子类可以在这个模版基础上进行扩展。(避免子类设计的随意性)
public abstract class text {
public abstract void run();//抽象方法
//有抽象方法的类应改为必然是抽象类
//抽象类可以包含属性、方法、构造方法,抽象方法不能有方法体。但构造方法不能用来new实例(即抽象类不能被实例化),只能用来被子类调用.
}
2.注意事项:
抽象类不能被直接实例化(不能用new),可以通过子类来实现实例化
抽象类只能用来继承
抽象类必须被子类实现
继承抽象方法必须重写,除非子类也是抽象方法
Abstract和final不能同时修饰类或方法S
五.接口
1.什么是接口?
接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”。
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
2.接口特征:
1) 属性都是公有静态常量
Int mun=100;
//编译成就变成
Public static final int MUN=100;
2) 所有方法都是公有抽象方法
Void abc();
Public abstract void abc();
3) 接口不允许有构造方法(因为不能被实例化,不能被继承,只能实现)抽象类可以被实例化,因为能被继承,子类可以被用到
4) 编写时如果该类继承父类,应先写extends再写implements实现接口
5) 接口也可以继承多接口
3.格式:
与定义类的class不同,接口定义时需要使用interface关键字。
public interface 接口名 {//可以将接口看做是只包含了功能声明的特殊类。
抽象方法1;
抽象方法2;
}
例子:
public interface MyInterFace {//接口中只有常量,抽象方法。接口默认修饰符:
String MAX_GEEAD=“boss”;
int MAX_GPEAD=120;//所有的接口 的 成员变量默认都是:puiblic static final
public void text01();//所有接口的 方法默认都是:public abstract
public void text02(int a,int b);
}
4. 类实现接口
类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。
其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能。
格式:
class 类 implements 接口 {
重写接口中方法
}
例子:
public class MyClass implements MyInterFace{
@Override
public void text02(int a, int b) {
}
@Override
public void text01() {
}
}
5.接口的多继承?
interface Fu1{
void show();
}
interface Fu2{
void show1();
}
interface Zi extends Fu1,Fu2{
void show3();
}
六.为什么需要接口?接口和抽象类的区别?
相同点:
都位于继承的顶端,用于被其他类实现或继承;
都不能直接实例化对象;
都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
抽象类是这个事物中应该具备的内容, 继承体系是一种 is…a关系
接口是这个事物中的额外内容,继承体系是一种 like…a关系
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;