重载
同一个类中,方法名相同,参数列表不同的方法称重载
注意: 同一个类
方法名相同
参数列表不同--参数类型不同,参数个数不同,参数顺序不同
与访问的修饰符无关
与返回值无关
与抛出的异常无关
重写
在具有继承关系的子类中,同名、同参,同返回类型。子类修饰符不能小于父类修饰符。子类抛出的异常不能比父类更广
在子类中
方法名相同
参数列表相同
返回类型相同
访问修饰符不能比父类更严格
抛出的异常不能比父类更广泛
多态的三种表现形式
1.重写
2.父类指针指向子类对象 -- A a = new B(); A是B的父类
3.接口指向实现类 --spring的controller层和service层依赖注入
构造方法
构造方法是最先执行的方法(但是晚于静态代码块和非静态代码块)
在具有继承关系的子类中,子类的构造方法第一行默认的super()。调用父类的构造方法
如果父类有多个构造方法,则子类构造方法中需要指定确定的父类构造方法。编译完成后,
先执行父类的构造方法。然后执行子类的构造方法(即子类的构造方法第一行是父类的构造方法)
抽象类/接口没有构造方法。因为它们不需要被实例化
抽象类可以有构造方法。只不过没有意义
抽象类和方法
有抽象方法的一定是抽象类。抽象类不一定有抽象方法。只不过这个时候这个类作为一个“框框的存在”
接口
接口中定义的属性和方法默认访问级别都是Public。如果实现了该接口,那么必须重写所有的方法。如果不想
重写方法,那么将这个类定义为抽象类,不想实现的方法定义为抽象方法即可。
一个类可以实现多个接口
一个接口可以继承抖个接口
一个类可以同时继承一个别的类,实现一个或者多个的接口。但是extends关键字要在前面
接口不能实现接口
接口就是一个特殊的抽象类-“干尸类”。里面所有的方法都是没有方法体的(抽象的)。
接口和抽象类的区别
接口是用来实现的。抽象类是用来继承的
接口可以继承别的多个接口。组成一个新的接口
抽象类可以继承一个别的类。或实现一个或者多个的接口
接口是一个100%的抽象类。里面的所有方法都是没有方法体的
抽象类可以包含非抽象的方法,也就是说可以给出某一些方法的实现
接口一般处于代码的最底层,作出一些规定。而接口之上一层抽象类层,对接口进行第一次实现。把不可能一次完成
的方法交由自己的子类实现。
抽象类可以有构造方法。而接口不可以有构造方法
接口中定义的变量只能为public static final,而且会默认增加
java中的异常
程序执行过程中意想不到的情况
java中,异常是以类的形式封装的。异常分为 Exception 和 error
Checked Exception 受检异常 编译时能被java编译器检测到的异常。
RuntimeException之外的Exception都是受检异常,受检异常必须在编译时进行处理
Unchecked Exception 非受检异常 RuntimeException之外的所有子类异常 error异常
方法上面抛异常 throw 异常类型,方法内部抛用 throws 异常对象
throw语句后面不能有别的语句。否则会出现编译错误"unreachable statement"
java各类修饰符应用对象
java中外部类不能被private和protect修饰。只能被public、默认、abstract、final修饰
对于内部类,可以修饰它的修饰符public、缺省、private、protect、abstract、final、static
对于类的声明来说,final和abstract是冲突的两个概念,不能既是final也是abstract
final修饰的类不能被继承
final修饰属性说明这个属性的值不可被更改
final修饰方法的时候表示不能被子类重写
对于方法的参数的修饰符仅仅可以用final,表示此参数只能用来为方法内的参数赋值而且本身不能被修改
对于属性变量,可以声明(但不赋初试值)。 局部变量,则声明的时候可以不赋值,但是第一次使用之前必须赋值(局部变量一般是声明的时候同时赋值)
java中常量是final决定的。而不是final static
如果final修饰的是一个引用类型的变量(一个句柄)。表示该变量一旦被分配一个对象后就不能在引用别的对象。可以改变所引用对象的内容
final FinalClass fc = new FinalClass();
fc = new FinalClass();//这句会编译出错。fc不能在引用其他类型的对象
final是唯一可以用于方法内部的局部变量修饰符
注1:
一个方法中的局部变量不能用static修饰。即使这个方法也是static修饰的方法。因为static是与类而不是类的实例相关的概念。方法内部的变量会随着
方法的推出而被撤销。因此一个方法体中声明的局部变量是不能被static修饰的。通过一个static的方法,不仅可以访问其中定义的局部变量,还可以访问
类中定义的static属性。如果要访问非static属性。则只能通过类实例来访问
注2:
static和非static方法的调用方式不同。对非static方法的调用在运行期间决定的,而对static方法的调用则发生在编译期。一个非static方法可以调用另一个
static方法,但是static方法不能调用非static方法。
注3:
一个static方法不能重写为一个非static方法。只能被重写为一个static方法。但是可以被overlaod为一个非static方法。
注4:
静态代码块不是一个方法。只是一个static修饰符加一个方法体(一对大括号的一组语句)。静态代码块主要用于初始化。该代码块仅被执行一次。
即在构造函数前执行。而且只执行一次。如果继承的父类里有静态代码块。会先执行父类的。但是子类的静态代码块要先于父类的构造函数。
如果一个类中存在多个静态代码块,那么其运行次序取决于在类中定义的次序。(排在前面的先执行)
注5:
非static代码块也不是一个方法。每当类创建实例的时候,非静态代码块获得执行,其运行在父类构造器之后,自己的构造器之前。
如果一个类中存在多个非静态代码块,那么其运行次序取决于在类中定义的次序。(排在前面的先执行)