1、重载和覆盖的区别
重载是在一个类中多态性的体现,是指一个类中定义了多个同名的方法,他们具有不同个的参数个数或者不同的参数类型。
重载注意:(1)、通过不同的方法参数来区分的,例如不同的参数个数、参数类型和参数顺序
(2)、不能通过方法的访问限制符、返回值类型或者抛出异常的类型来进行重载,
(3)、在继承中,基类中方法是private的,派生类中出现同名的方法,不属于重载,是一个新的方法。
覆盖是指派生类函数覆盖了基类函数,对基类中的函数进行了overwrite,需要注意:
(1)、派生类中覆盖的方法必须和基类中的方法同名、同参
(2)、派生类中覆盖的方法必须和基类中方法返回值相同
(3)、派生类中覆盖的方法必须和基类中抛出的异常一致(1 2 3 不这么设置会出现编译错误)
(4)、基类中被覆盖的方法不能是private,
重载和覆盖的区别:
覆盖是垂直关系,子类和父类的关系;重载是一个类内
覆盖只能是一个方法或者一对方法发生关系,重载是多个方法之间的关系
覆盖要求参数列表相同,重载要求参数列表不同,
覆盖关系中,调用方法根据对象的类型(对象对应的存储空间类型)如
Person p=new Student Student s=new Studnet
,重载关系是根据调用时的实参表和形参表来选择方法体。
-------------------------------------------------------------------------------------------------------------------------------------------------
多态的实现机制:对方法的重载 与覆盖( 编译时多态和运行时多态)
继承:不支持多重继承、只能继承父类中非私有(public 与proctected)成员方法和变量,子类与父类中的成员变量和方法重名时会覆盖!
反射机制: 反射机制的功能是,得到一个对象所属的类,获取一个类中的所有成员变量和方法,在运行时创建对象,在运行时调用对象的方法 运行时动态的创建类 获取类的方法有3种:Class.forName("类的路径") 类名.class 实例.getClass()
关于反射机制的例子,可以参考这个博客:https://blog.csdn.net/xiao_Hebut/article/details/98944260
抽象类与接口的区别:
相同点:都不能被实例化,接口的实现类或抽象类的子类都只有实现了接口或者抽象类才能被实例化
不同点:接口中只有定义不能有方法体,而抽象类中可以有定义和实现
接口需要implements ,抽象类需要extends ,一个类可以实现多个接口,但是只能继承一个类,
接口强调特定功能的实现,设计理念是“has a ”关系,抽象类中强调的是所属关系,其设计理念为“is_a”关系,
(4)接口中定义的成员变量默认是public static final ,只能够有静态的不能被修改的数据成员,而且必须被赋初值,所有的成员方法只能是public abstract ,而且只能被这两个关键字修饰,而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,其成员默认是default ,可以被定义为private protected和public,这些成员变量可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法不能用private 、static、synchronized、native 等访问符修饰,所以当功能需要积累的时候,用抽象类,不要的时候用接口。
内部类:静态内部类、成员内部类、局部内部类、匿名内部类
class outerclass{
static class innerclasss{} //静态内部类
}
class outerclass{
class innerclasss{} //成员内部类(普通)
}
class outerclass{
public void menberFun(){
class innerclass{}//局部内部类
}
}
静态内部类:可以不依赖外部类实例而被实例,不能于外部类同名,不能访问外部类的普通成员变量,只能访问外部类的静态成员与方法(包括私有类型)
成员内部类,为非静态内部类,可以自由的引用外部类的属性和方法,无论是静态与否,但是它与一个实例绑定了一起,就不可以定义静态的属性和方法,必须在外部类实例化后,这个内部类才能实例化。非静态内部类不能有静态成员
局部内部类:不能被public、protected、private、以及static修饰,只能访问方法中定义为final类型的局部变量,
匿名内部类;必须继承其他类或者实现其他接口,匿名内部类不能有构造方法,不能定义静态成员、方法和类、不能是public 、protected、private、statc、只能创建匿名内部类一个实例,只能在new后面,这个匿名类必须继承一个父类或实现了一个接口,