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,那么就不能在子类中对其进行重载,如果定义的话也只是定义了一个新方法,不会达到重载的效果