面向对象的三大特征:封装、继承、多肽
一、封装
封装的体现—方法;
属性私有化,通过公共的访问方式去进行正常的取值和赋值,提高数据的安全性。
二、继承
1.概念
多个类中有相同的内容,把相同的内容抽取到一个新的类,此时通过extends使得原来的类与新类之间就产生了继承关系,原来的类就称之为子类、派生类,新类就称之为父类、超类、基类—只能获取父类部分信息。
2.单继承与多继承(看场景)a b c 多级继承
java支持单继承—子类只能有一个父类,父类可以有多个子类;避免出现方法的混用,提高代码的复用性
C语言支持多继承—极高的提升代码复用性
Class A{
m(){}
}
Class B{
n(){}
}
Class C extends A,B---->n(),m()
Class A{
void m(){}
}
Class B{
int m(){return 1;}
}
Class C extends A,B--->?=c.m();会产生方法的混用
3.重写(覆盖)
在父子类中发生方法签名一致的方法,遵循重写原则:(两等两小一大)
①.方法签名相等
②.如果父类的方法的返回值是基本数据类型/void,那么子类的方法的返回值就和父类相等
Class A{
public int m(){return 1;}
}
Class B extends A{
public int m(){return 2;};
}
③.如果父类的方法返回值是引用数据类型,子类的方法返回值数据类型要么和父类一致要么是父类的子类
Class A{}
Class B extends A{}
Class C{
Public A m(){return null;}
}
Class D extends C{
public A/B m(){return null;}
}
所有的基本数据类型都是同一数据级别
④.子类方法的访问权限修饰符要么和父类一致要么大于父类的范围
Class A{
void m(){}
}
Class B extends A{
Protected void m(){}
}
子类拿不到父类的私有信息,构造代码块以及构造方法
4.super
指代父类对象的引用,可以调用父类的属性和方法。
super语句—在子类构造方法中调用父类构造方法,在子类构造方法中,如果没有定义任意形式的super语句,JVM就会默认添加super()去调用父类的无参构造;如果父类没有提供无参构造,子类每个构造方法就要定义对应形式的super语句,在首行—父类对象优先于子类对象 。
执行顺序:父类的构造代码块–>父类构造方法–>子类的构造代码块–>子类构造方法
建议:
未来做开发, 基本不会自己写构造方法,都用默认构造方法,要了解构造方法。
三、多态
1.概念
在代码的使用过程中可以具有灵活的展现形式
从时期的角度,分析多态,编译时期和运行时期
编译时期多态—在编译时期绑定代码 重载
public static void m(int i){}
public static void m(int i,int j){}
运行时期多态—在运行时期绑定代码 重写,向上造型 前提是继承
2.向上造型
向上造型创建的对象能调用哪些方法看父类,方法的具体执行看子类(父类—目录,子类—正文)
3.对重写原则的解释
①.子类的方法的访问权限修饰符要么和父类一致要么大于父类的范围
反证
Class A{
public void m(){}
}
Class B extends A{
void m(){}
}
A a=new B();//向上造型创建出了对象
a.m();//声明类是A,此时对象就可以调用A类的m方法,这个方法可以在任意位置调用
//方法的执行看子类,此时对象真实调用的B类的m方法,这个方法可以在同包类位置可以调用
前后结论有矛盾
②.如果父类的方法的返回值是引用数据类型,子类方法的返回值数据类型要么和一致要么是父类的子类
反证
Class A{}
Class B extends A{}
Class C{
public B m(){return null;}
}
Class D extends C{
public A m(){return null;}
}
C c=new D();//向上造型
B b=c.m();//声明类是C类调用的m方法返回的是B类,b对象就可以调用B类中的所有信息
A a=c.m();//方法的具体执行看子类是D类调用m方法返回的是A类,a对象可以调用A中所有的信息
结论有矛盾
4.优点
统一调用 ,解耦(降低耦合度 高内聚低耦合)