1、修饰符访问权限如下表所示:


修饰符

类内部

同一个类

子类

任何地方

private

     √




default

     √

        √



protected

     √

        √

    √


public

     √

        √

    √

     √

protected也可以给不在同一包中的子类访问

2、final:修饰的方法不允许子类覆盖但可以继承

修饰的类不能被继承 

修饰的引用类型不能再指向别的地方,但对象内容可以改变

不能用于修饰构造方法final成员变量表示你常量,只能被赋值一次,赋值后值不再修改

3、static:

(1)静态方法:无需本类的对象即可调用此方法

 

 

 

(2)静态变量:声明为static的变量实质上就是全局变量

当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,

也就是说不管你new多少个类的对象,这个static变量永远只有一个

(3)静态类:通常一个普通类不允许声明为静态的,只有一个内部类才可以。

     

(4)static变量、方法或程序块是在类被装载的时候开始执行,而不是在对象创建时开始执行

4、同时被final和static修饰的类的属性变量只能在两种情况下初始化:

(1)在它被定义的时候   public static final int a=1;

(2)在类的静态块里初始化  public static final int a;static{a=1;}

5、抽象类:

(1)含有abstract修饰符的class即为抽象类

(2)抽象类不能被实例化,实例化的工作由它的子类完成

(3)含有抽象方法的类必须定义为抽象类

(4)抽象中的方法不必是抽象的

(5)抽象类中的抽象方法必须由子类来实现

(6)抽象类不能有抽象构造方法

(7)如果子类没有实现父类中所有的抽象方法那么子类也必须定义为abstract类型

(8)abstract不能和final并列修饰同一个类

(9)abstract不能和private、static、final或native并列修饰同一个方法

6、接口:

(1)接口是抽象类的一种特例

(2)接口中的所有方法都必须是抽象的

(3)接口中的方法默认为public abstract类型

(4)接口中的成员变量默认为public static final类型

(5)实现接口的非抽象类必须实现该接口的所有方法,抽象类不用

(6)不能用new实例化一个接口但可以声明一个接口变量

7、接口和抽象类的区别:

(1)抽象类可以有构造方法,接口中不能有构造方法

(2)抽象类中可以有普通成员变量,接口中没有

(3)抽象类可以包含非抽象的普通方法,接口中没有

(4)抽象类可以包含静态方法,接口没有

(5)抽象类中的静态成员变量的访问类型任意,接空中只能为public

(6)一个类可以实现多个接口,但只能继承一个抽象类

(7)抽象类是对抽象,接口是对行为抽象

(8)抽象类跨域的是有相似特点的类,而接口却可以跨越不同的类

(9)接口更多的是在系统架构设计上发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

8、String、StringBuffer、StringBuilder

(这篇文章讲的相当之详细了——>Java String, StringBuffer和StringBuilder实例

String:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    ...
}

String 是final类,所以不可以继承String类

String实现了CharSequence接口

String使用final字符数组来保存字符串,所以String对象是不可变的

StringBuffer、StringBuilder:

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{...}
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{...}
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;
    ...
}

StringBuffer和StringBuilder都继承了AbstractStringBuilder类,AbstractStringBuilder实现了Appendable、CharSequence接口

AbstractStringBuilder通过字符数组来存储字符串,所以StringBuffer和StringBuilder是可变的

public synchronized int length() {
        return count;
    }

    public synchronized int capacity() {
        return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > value.length) {
            expandCapacity(minimumCapacity);
        }
    }
...

StringBuffer对所有方法都加了同步锁,所以StringBuffer是线程安全的,StringBuilder没有加是非线程安全的

String实现了equals方法,StringBuffer和StringBuilder没有

String是不可变的,所以每次对String类型进行修改的时候都会创建一个新的对象,然后将指针指向新的对象

StringBuffer是对对象本身进行操作

如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

(参考资料:Java:String、StringBuffer和StringBuilder的区别、从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接)

9、override

(1)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变

(2)子类和父类在同一个包中,那么子类可以重写弗雷德所有方法,除了private和final方法

(3)覆盖方法所抛出的异常必须和被覆盖方法所抛出的异常一致,或者是其子类

(4)构造器不能被继承,所以不能被重写,但可以重载

10、overload

(1)重载表示一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(参数类型不同。参数顺序不同、参数个数不同)

(2)不能通过访问权限、返回类型、抛出的异常进行重载

(3)对于继承来说,如果某一方法在父类中访问权限是private,那么就不能在子类中对其进行重载,如果定义的话也只是定义了一个新方法,不会达到重载的效果