面向对象

面线对象三个基本特征:继承,封装,多态。

继承:子类继承父类,子类获得父类的属性和方法。

封装:将客观事物封装成抽象的类,并且只能让特定的对象操作。

多态:一个类实例的相同方法在不同情形有不同的表现形式。


多态的两种实现方式:重载和重写。

重载(Overload):是一个类中多态性的一种表现,方法名必需相同,参数列表必需不同.(长度不同或类型不同),与返回值类型没有关系.构造器也可以重载.方法名和类名相同,参数不同. Overloaded的方法是可以改变返回值的类型。

重写(Override):是父类与子类之间多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。


抽象和接口

抽象和抽象方法:abstract

1.抽象类和抽象方法都是通过abstract关键字修饰。

2.抽象类不能实例化。抽象类中可以没有、有一个或者多个抽象方法,甚至全部方法都可以是抽象方法。

3.抽象方法只有方法声明,没用方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。

接口:interface定义了一套标准(方法),这些方法通常都是没有实现的,类可以来实现这些方法来支持(implements)这个标准

特点:

1.接口不能被实例化

2.一个类只能有一个父类,但是可以实现多个接口

3.接口不能有实例变量,但是可以有static final变量

4.接口的方法都是抽象方法 - 静态(public static)和default方法除外

5.接口可以没有任何方法

6.接口可以有属性,但属性默认是public static和final

接口和抽象的区别:

1.接口只能做方法申明,抽象类可以做方法申明,也可以做方法实现。

2.接口要被类实现,抽象类要被子类继承。

3.接口可以继承接口,并可以多继承接口,但类只能单个继承。

4.接口定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。


常用关键字:

static:

1.变量:被static修饰的变量叫做静态变量(类变量),没有被修饰的叫实例变量。

区别:静态变量在内存中只有一份拷贝,JVM只为静态分配一次内存,在加载过程中完成静态变量的内存分配,直接通过类名访问。

          实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中多个拷贝,互不影响。

2.静态方法:静态方法可以直接通过类名调用,任何的实例也都可以调用。

因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法

3.static代码块:static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次

利用静态代码块可以对一些static变量进行赋值。

final:

final用于声明属性,方法和类,分别表示属性不可变。

修饰类:不能被继承;修饰方法:不能被重写;修饰变量:不能被修改,是常量

synchronized线程、同步:

1.synchronized 关键字可以应用于方法或语句块,并为一次只应由一个线程执行的关键代码段提供保护。

2.synchronized 关键字可防止代码的关键代码段一次被多个线程执行。

3.如果应用于静态方法,那么,当该方法一次由一个线程执行时,整个类将被锁定。

4.如果应用于实例方法,那么,当该方法一次由一个线程访问时,该实例将被锁定。

5.如果应用于对象或数组,当关联的代码块一次由一个线程执行时,对象或数组将被锁定。

this:

this关键字必须放在非静态方法里面

this关键字代表自身,在程序中主要的使用用途有以下几个方面:

1. 使用this关键字引用成员变量

2.使用this关键字在自身构造方法内部引用其它构造方法

3.使用this关键字代表自身类的对象

4. 使用this关键字引用成员方法

修饰符:

default不加 - 在自己的package里面可用

public - 所有地方都可以用

private - 只有在自己的类里面可用

protected - 在子类和当前package




常见面试题:

1.谈谈final, finally, finalize的区别。

2.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?(可以)

3.接口和抽象的区别。

4.构造器 Constructor 是否可被 Override?

:构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

5. 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句 话对不对?

答:不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。(要扩展)

(1)如果两个对象相同(equals 方法返回 true ),那么它们的 hashCode 值一定要相同;

(2)如果两个对象的 hashCode相同,它们并不一定相同。当然,你未必要按照要求 去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素 的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)

6.java 中实现多态的机制是什么?

答:靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法

7.关于static和this的题:

public class This{

static int value = 9; //注意value是静态的成员变量

public static void main(String[] args) throws Exception{

new This().printValue();

}

private void printValue(){

int value = 69;

System.out.println(this.value);

System.out.println(value);

}}

你可能感兴趣的:(面向对象)