1、Java的特性和优势:简单性、面向对象、可移植性、高性能、分布式、多态性、多线程、安全性、健壮性。
2、Java 的运行机制,计算机高级编程语言类型有:编译型、解释型。Java 语言是这两种类型的结合,利用编辑器编写 Java 源程序,然后编译器将源程序编译成class文件,再利用虚拟机(解释器)解释执行,运行过程:载入、代码校验、解释执行。
3、Java运行时环境JRE包含:Java虚拟机、库凼数、运行Java应用程序和Applet所必须的文件。
开发环境JDK(又称SDK)包含:JRE的超集、编译器、调试器等开収工具。
4、Java运行环境的三项主要功能:
加载代码:由class loader完成;
代码校验:由bytecode verifier完成;
执行代码:由runtime interpreter完成。
5、Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有3类8种基本数据类型(逻辑型-boolean;文本型-char;数值型-byte、short、int、long、float、double),引用数据类型有类(class)、接口(interface)、数组(array),注意,引用数据类型的大小统一为4个字节,记录的是其引用对象的地址。byte类型(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)。
6、&&:和&运算的结果是一样的,但是运算过程有点小区别。&:无论左边的运算结果是什么,右边都参与运算;&&:当左边为false时,右边不参与运算。
||:和|运算的结果是一样的,但是运算过程有点小区别。|:无论左边的运算结果是什么,右边都参与运算。||:当左边为true时,右边不参与运算。
7、异或运算中,当一个数异或运算同一个数两次,结果还是这个数本身,如a^b^b=a
8、栈内存:存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放。
堆内存:存储是数组和对象(其实数组就是对象) 凡是new出来的都在堆中。
特点:每一个实体都有首地址值。堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean false char 'u0000'。因此局部变量必须初始化,而全局变量则可以不初始化已有默认值。
9、数组
数组常见的两种异常:下标越界和空指针异常
数组的定义:数组是相同类型数据的集合,描述的是相同类型的若干个数据按照一定的先后顺序排列组合而成,其中每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它。
数组的四个基本特点:
1.长度固定,一旦被创建它的长度就是不可改发的;
2.其元素类型必须是相同类型,不允许出现混合类型;
3.数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型;
4.数组变量属于引用类型,数组也可以看做是对象,数组中的每个元素相当于该对象的成员变量,数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组本身是在堆中的。
10、成员变量和局部变量的区别:
成员变量定义在类中,整个类中都可以访问。 局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
成员变量存在于堆内存的对象中。局部变量存在于栈内存的方法中。
成员变量随着对象的创建而存在,随着对象的消失而消失。局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
成员变量都有默认初始化值。局部变量没有默认初始化值。
11、构成函数
构造函数:构建创造对象时调用的函数。
作用:可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。
一般函数和构造函数什么区别:
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化,会调用只调用一次。
一般函数:对象创建后,需要函数功能时才调用, 可以被调用多次。
什么时候定义构造函数?
在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。 构造函数可以有多个,用于对不同的对象进行针对性的初始化。多个构造函数在类中是以重载的形式来体现的。
12、静态代码块:随着类的加载而执行。而且只执行一次。作用:用于给类进行初始化。
13、static的特点:
static是一个修饰符,用于修饰成员。
static修饰的成员被所有的对象所共享。
static优先于对象存在,因为static的成员随着类的加载就已经存在了。
static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。
static修饰的数据是共享数据,对象中的存储的是特有数据。
14、成员变量和静态变量的区别
两个变量的生命周期不同:
成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据
15、静态使用的注意事项:
静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
静态方法中不可以使用this或者super关键字。
主函数是静态的。
16、抽象类
特点:
方法只有声明没有实现,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中。该类必须也被abstract修饰。
抽象类不可以被实例化。为什么?因为调用抽象方法没意义。
抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。否则,这个子类还是抽象类。
抽象类中有构造函数,用于给子类对象进行初始化。
抽象类可以不定义抽象方法, 但是很少见。目的就是不让该类创建对象。AWT的适配器对象就是这种类。
抽象关键字不可以和这些关键字共存?private、static、final
抽象类和一般类的异同点:
相同点:抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同点:
一般类有足够的信息描述事物。抽象类描述事物的信息有可能不足。
一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
一般类可以被实例化。抽象类不可以被实例化。
抽象类一定是个父类,因为需要子类覆盖其方法后才可以对子类实例化。
17、继承和构造凼数
子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。
为什么子类实例化的时候要访问父类中的构造函数呢?
那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时,必须访问父类中的构造函数。注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
18、final关键字
final是一个修饰符,可以修饰类,方法,变量。
final修饰的类不可以被继承。
final修饰的方法不可以被覆盖。
final修饰的变量是一个常量,只能赋值一次。
为什么要用final修饰变量。其实在程序如果一个数据是固定的,那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。而且这个变量名称的值不能变化,所以加上final固定。
19、抽象类和接口的异同点
相同点:都是不断向上抽取而来的。
不同点:
抽象类需要被继承,而且只能单继承。接口需要被实现,而且可以多实现。
抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。接口中只能定义抽象方法,必须由子类去实现。
20、一个对象实例化过程
Person p = new Person();
JVM会读取指定的路径下的Person.class文件加载进内存,并会先加载Person的父类(如果有直接的父类的情况下).
在堆内存中的开辟空间,分配地址。
并在对象空间中,对对象中的属性进行默认初始化。
调用对应的构造函数进行初始化。在构造函数中,第一行会先到调用父类中构造函数进行初始化。父类初始化完毕后,再对子类的属性进行显示初始化。在进行子类构造函数的特定初始化。初始化完毕后,将地址值赋值给引用变量。