封装:
- 把对象的全部属性和服务结合在一起,形成不可分割的独立单位;
- 尽可能隐藏内部细节。(数据隐藏、隐藏具体实现的细节)
public、private、protected、default
- public:既可以跨类访问,也可以跨包(package)访问
- private:只能被该类对象访问,子类不能访问,更不能跨包访问
- protected:只能被该类本身和子类访问,即使子类不在包中也可以访问
- default:即不添加任何修饰符,只允许同一个包进行访
继承:
1. is a 关系(eg:经理 is a 职员)
- 初始化子类必须先初始化父类(虚拟机自动完成)因为子类的构造方法中会调用父类的构造方法
- 单继承性:一个子类只能继承一个父亲
- 关键字super:用来引用自己的父类,比如父类的方法和属性都是可以访问的
2.方法覆盖
- 返回类型、方法名称、参数列表必须与它所覆盖的方法相同
- 访问权限不能缩小
- 不能抛出更多异常
3.方法重载
- 同一个方法(包括父类),方法名相同,参数列表不同,返回类型可相同可不同
多态:
- 简单说就是子父类(接口或实现类)中的类型转换
1. 属性的特点:属性不是多态的,当子类中出现相同属性时,以左边的引用为准。
class A{
int num = 3;
}
class B extends A{
int num = 5;
}
main{
A a = new B();
sop(a.num); //输出3
B b = new B();
sop(b.num); //输出5
}
2.非静态私有函数特点:
- 编译时期:引用变量所属类(父类)中是否有调用方法,如果有编译通过,若没有编译失败。
- 运行时期:如果子类复写了父类方法,运行子类中的方法,若没有运行父类方法
3.静态函数特点:
- 和属性一样,static方法不是多态的,无论编译还是运行都参考左边。
4.instanceof运算符:
- 前面是一个引用类型变量后面是一个类,用于判断前面的对象是否是后面的类的实例,如果是返回true,若不是返回false,避免了ClassCastException。
public interface Animal {
public abstract void eat();
}
public class Cat implements Animal{
public void eat(){
System.out.println("chi yu");
}
public void catchMouse(){
System.out.println("zhu lao shu");
}
}
public class Dog implements Animal{
public void eat(){
System.out.println("chi gu tou");
}
public void kanHouse(){
System.out.println("kan men");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Cat();
function(a);
}
public static void function(Animal a){
a.eat();
if(a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d = (Dog)a;
d.kanHouse();
}
}
}