重载和重写的区别
方法重载是一个类中有多个同名函数存在,具有不同的参数
在子类中定义一个与父类中方法同名同参的方法
构造方法
写一个带参构造方法时,需要把无参的构造函数也写上,否则无法new无参构造方法
子类未声明构造方法时,执行父类的无参构造方法
子类有声明构造方法时,先执行父类的无参构造方法,再执行子类的构造方法
子类需要调用父类有参构造方法时,在子类构造方法的第一行使用super
一个类种多个构造方法,调用其他构造方法使用this
多态
继承 方法重写 向上转型
动态绑定(运行时绑定)
public class BMW extends Car{
public static void main(String[] args) {
Car b = new BMW(); //继承 向上转型
b.bye();//方法重写
}
void bye() {
System.out.println("bye BMW");
}
}
class Car {
void bye() {
System.out.print("bye Car");
}
}
继承
父类的私有属性和方法不会被继承
类初始化
从最顶的父类顺序初始化静态static变量,接着初始化当前类的静态static变量,static变量的初始化是伴随着类被装载时而初始化的,它的初始化在任何构造函数执行前
抽象类
有抽象方法一定是抽象类,抽象类不一定有抽象方法
抽象方法无具体实现
扩展抽象类,一是在中定义部分抽象方法,那子类也是抽象类,二是定义全部抽象方法,那子类可以不定义成抽象类
接口
一个接口可以被多个类实现,一个类也可以实现多个接口,接口只能有抽象方法和静态常量
接口中所有的定义的字段默认都是public static final 的属性,写和不写没有区别。
接口中的方法都是抽象的方法,并且抽象的方法默认都是public abstract修饰的,不能用其他的修饰符修饰,可以不写。
接口中没有构造方法
接口不是类,尤其不能使用new运算符实例化一个接口。但是可以声明接口的变量,这个变量可以指向实现了此接口的子类。
接口与抽象类的区别:
不同点:
1、接口可以多实现,而抽象类只能单继承
2、抽象类可以有非抽象的方法和构造方法、变量,但是接口只能有抽象方法,静态常量。
3、抽象类和子类具有父子关系,子类能拥有父类中一些属性。接口虽然某个类实现一个接口,但是由于接口中的变量都为静态常量,不存在继承关系。相同点:
1、无论接口还是抽象类,都无法直接实例化,其自身实例化需要靠实现类或子类来实现。
2、接口和抽象类都必须实现其中的所有方法。
super
引用父类的构造方法,super必须在构造方法第一行
引用父类成员变量和方法
this
引用同类的构造方法,this必须在构造方法第一行
引用同类成员变量和方法
访问权限修饰符
修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
Private | √ | × | × | × |
Default | √ | √ | × | × |
Protected | √ | √ | √ | × |
Public | √ | √ | √ | √ |
abstract
抽象类不能被实例化
抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象方法
如果子类没有实现父类中所有的抽象方法,子类也必须定义为抽象类
抽象类不能被定义为 private、final、和 static 类型
没有抽象的构造方法
抽象方法没有方法体,如果一个方法没有方法体,那么该方法必须声明为抽象的方法
非抽象类继承抽象类的时候,必须要把抽象类中的所有抽象方法实现
static
如果声明了静态方法或变量,值是放在方法区,因为方法区是一个数据共享区;所以不管什么变量访问它,都是同一份
在静态方法中不能直接访问实例方法和实例变量
在静态方法中不能使用 this 和 super 关键字
静态方法不能被 abstract 修饰.
静态的成员变量可以使用类名或者是对象进行访问,非静态成员变量只能使用对象进行访问.
静态函数可以直接访问静态的成员,但是不能够直接访问非静态成员.,非静态函数可以访问静态和非静态成员.
当类被加载时,静态代码块只能被执行一次。类中不同的静态方法代码块按他们在类中出现的顺序被依次执行.
当多个修饰符连用时,修饰符的顺序可以颠倒,不过作为普遍遵守的编码规范,通常把访问控制修饰符放在首位,其次是 static 或 abstact 修饰符,接着就是其他的修饰符
final
final 变量必须被显式初始化,并且只能被赋值一次值
final 修饰基本类型变量的时候, 该变量不能重新赋值
final 修饰引用类型变量的时候, 该变量不能重新指向其他对象
final 修饰的方法为最终的方法, 该方法不能被重写
private 类型的方法都默认为是final方法,因而也不能被子类重写
final 修饰的类为最终的类, 不能被继承