Package是比较抽象的逻辑概念,包含java中各类相关文件。他的主要作用1.提供从多层命名空间,避免冲突;2. 对类按功能进行分类,使项目的组织更加清晰。
函数指针就是实现回调函数,一般用于截获消息、获取系统信息或处理异步事件。
1. 出发点不同,面向对象方法是用符合常规思维的方式来处理客观世界的问题;强调把问题域的要领直接映射到对象及对象之间的接口上。面向过程方法强调的则是过程的抽象化与模块化。
2. 层次逻辑关系不同。面向对象是用类的层次结构来体现类之间的继承和发展。面向过程是用模块的层次结构概括模块或模块间的关系与功能。
3. 数据处理方式与控制程序方式不同。面向对象是对象的修改只能由自身成员函数完成,控制程序的方式是通过“事件驱动”来激活和运行程序。面向过程第直接通过程序来处理数据,模块之间存在控制被控制等关系。
4. 分析设计与编码转换方式不同。面向对象是贯穿软件生命周期,实现的是一种无缝连接。面向过程强调分析、设计及编码之间按规则进行转换,有缝连接。
1 抽象。过程抽象和数据抽象,即不涉及和繁复的具体方面。
2 继承。
3 封装。指客观事物抽象成类,每个类对自身的数据和方法实行保护。
4 多态。允许不同类的对象对同一消息做出响应。灵活、抽象、行为共享、代码共享等优势。
多态有两种表现形式:方法的重载(overload,编译时多态)和方法的覆盖(override,运行时多态)。
基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例化对象。接口的引用变量也可以指向其实现类的实例对象。程序调用方法在运行期才动态绑定(方法调用和方法主体连接到一起)即引用变量所指向的具体实例对象的方法。通过动态绑定实现了多态。
父类:
public class Base {
// 构造函数
public Base(){
g();
}
public void f(){
System.out.println("Base f()");
}
public voidg(){
System.out.println("Base g()");
}
}
子类:
public class Derived extends Base {
public void f(){
System.out.println("Derived f()");
}
public void g(){
System.out.println("Derived g()");
}
}
测试:Base b= newDerived();b.f();b.g();
结果是:Derived g() //子类的g()方法和f()方法覆盖了父类中的方法。因为先要调用父类的构造函数,而父类构造函数中执行了g()方法,由于Java的多态性(动态绑定),所以此时调用的是子类中的g()方法.
Derived f()
Derived g()
注意:只有类中的方法才有多态概念,成员变量没有多态的概念。
内部类主要分为4种:
1静态内部类。可以不依赖外部类实例化而被实例化,不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。
2成员内部类。即非静态内部类,可以自由的引用外部类的属性和方法。但是它与一个实例绑定在一起后,不可以定义静态的属性和方法。只有外部类被实例化后才能被实例化,且不能有静态方法成员。
3局部内部类。是定义在外部类中的一个代码块(实例方法或实例初始化)中的类,作用范围就是该代码块。
4匿名内部类。没有类名的内部类,没有构造函数,必须继承其他类或实现其他接口。不能定义静态成员、方法和类;不能是public、protected、private、static;只能创建匿名内部类的一个实例;一定是在new的后面。
this是用来指向当前实例对象,她的重要作用就是用来区分对象的成员变量和方法的形参。
super可以访问父类的方法和成员变量。当子类的方法或成员变量与父类的同名是也就是覆盖了父类的方法或成员变量,要想访问父类的方法只能通过super。
1) final、finally、finalize的区别
1 final用于声明属性、方法和类。分别表示属性不可变、方法不可覆盖、类不可被继承。
final成员变量:是引用的不可变性(它只能指向初始时指向的那个对象)。所以被final西施的变量必须初始化:在定义的时候初始化;final成员变量可以在初始块中初始化,不可以在静态初始化块中初始化;静态final成员变量只能在静态初始化块中初始化;在类的构造器中初始化,除静态成员变量。
final方法:子类不能重写,但是可以使用这个方法。
final参数:该参数在这个函数内部不能被修改
final类:一个类不能被声明为abstract又被声明为final。
2 finally 是异常处理的一部分,finally附带语句表示这段语句最终一定被执行。所以可以用在需要释放资源的情况下。
3 finalize()方法,垃圾回收器执行是会调用被回收对象的finalize()方法,可以覆盖此方法实现对其他资源的回收。
2) assert的作用
断言的意思,是一种软件调试的方法,提供了一种在代码中正确性检查的机制。主要是boolean表达式的检查。
3) static的作用
主要作用:1 为特定数据类型和对象分配单一的存储空间,与创建对象的个数无关;2 实现某个方法或属性与类关联在一起的,即在不创建对象的情况下就可以通过对类来直接调用方法或使用类的属性。
static成员变量:静态变量(在内存中只用一个复制,也就是所有实例指向的同一个内存地址)在类被加载时就会被分配空间,可以是被使用了。有两种方式来引用静态变量:“类.静态变量”和“对象.静态变量”。注意:不能在成员函数内部定义静态变量。
static成员方法:与成员变量的调用类似。static方法不能使用this和super,不能调用非静态方法和非静态类型的变量。因为当static方法被调用是,这个类对象可能还没别创建,即使被创建也无法确定调用哪个对象的方法。
static的一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例,用private来声明构造函数,并提供一个创建对象的方法,必须将方法声明为static,这样的目的是外界类能通过该类提供的方法来获取对象。
static代码块:独立于成员变量和成员函数的代码块。静态代码块经常被用来初始化静态变量,这些static代码块只会被执行一次。
static内部类:不依赖外部类实例对象而被实例化,不能与外部类同名,不能访问外部类的普通成员变量,只能是静态成员和方法。
1 实例变量:在实例化对象后,实例变量归对象所有。每当实例化一个对象时,会创建一个副本并初始化。各个对象中的实例变量互不影响。
2 局部变量:在方法中定义的变量,使用前必须初始化。
3 类变量:就是用static修饰的属性和变量,实例化的对象共享类变量。
4 final变量:常量。
5 static和final结合使用修饰变量(一旦赋值不可改变,可通过类名访问)和方法(表示该方法不可覆盖,通过类名访问)。
volatile是一个类型修饰符,被设计用来修饰被不同线程访问和修改的变量。被修饰的变量,系统每次都是从对应的内存中提取的,而不会利用缓存。volatile不能保证的操作的原子性,一般使用sychronized。
instanceof是一个二元运算符,用于判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。返回的是boolean类型的数据。也就是instanceof左边的变量是否是右边的实例,是返回true。
strictfp是strict float point的缩写,指的是精确浮点,用来确保浮点运算的准确性。