一、重点知识
error的子类后缀,一般都是error,但注意是一般,也不绝对
除了RuntimeException和他的子类是运行时异常,其他都是编译时异常
运行时异常,编译时是不会报错的
子类对象看为父类类型————向上转型
多态性,建立在子父类关系上——也就是只能父类的引用指向子类的对象,左边父类,右边子类,不能反过来
运行异常 classCastException 类型转换错误,类型不兼容,下面为例
父类不能直接强转为子类(可以转的前提:哪来哪去)可以转的前提是先有子类对象向上转型为父类,再有父类对象向下转型为子类对象,没有前提向上转型,编译可以通过但是会强转失败运行异常classcastExcption
注意java8以后接口中的默认方法,default代表的是默认,并不是原来权限修饰符中的那个缺省,他不是权限修饰符,可以和权限修饰符共存,默认方法可以省略public但是注意他仍然是一个public的方法
一定是子类对象才存在多态
抽象类是没有方法体的
有抽象方法的一定是抽象类,因为如果不是抽象类就可以创建对象了,但是抽象方法又无法调用,所以一定是抽象类
多态也提高了代码的扩展性
二、重点问题
1、静态方法能不能重写?
1、自己的理解
原则上是可以被重写的,但是子类重写的静态方法并不能实现对父类里的静态方法的全遮挡,导致调用仍然是调用父类的静态方法,因为静态方法随着类的加载而加载,子类对象和父类对象是绑在一起的,super的原因,此时你想调用子类的静态方法,直接类名加对象就可以调用了,在java中最好通过类名.的方式来调用静态方法,因为你如果用对象.的方式来调用静态方法,他还要先去类中找,然后再去静态域找,而用类名调用可以直接调用,快捷。
2、在Java中静态方法可以被继承,但是不能被覆盖,即不能重写。
3、如果子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。
4、父类引用指向子类对象时,只会调用父类的静态方法。所以,它们的行为也并不具有多态性。
5、静态方法是类的方法和具体对象没关系,和直接用类名调用一样。 静态方法是编译时绑定的,方法重写是运行时绑定的。
6、所以子分类中的同名方法,要么都是非静态,构成重写,要么都是静态,不构成重写,不能一个是静态一个非静态,会报错。
2、重写是一种遮挡或者隐藏,而不是覆盖
多态的前提下,如何调用父类被重写的方法
public static void main(String[] args) {
Father father = new Son();
Son son = (Son)father;
son.gg();
}
}
class Father{
public void cc(){
System.out.println("曹宇");
}
}
class Son extends Father{
public void cc(){
System.out.println("杨鹏");
}
public void gg(){
super.cc();
}
}
三、课堂知识
3.1 引用了类型作为参数
设计方法的时候:方法中可能需要参数(数据类型 参数名)
数据类型:
基本类型:byte,short,int,long,float,double,char,boolean
作为参数传递的时候:传的是数值。
int i = 100;
引用类型:数组,对象。。。
作为参数传递的时候:传的是引用的地址
3.2、对象的多态性
概念:指的是子类对象的多种形态:
父类的引用指向子类的对象
1、如果声明了一个父类类型的引用(=左边),创建的是父类的对象(=右边)。
可以访问父类的属性和方法。(不能访问子类的)
2、如果声明了一个子类类型的引用(=左边),创建的也是子类的对象(=右边)。
可以访问父类的属性和方法。
还可以访问子类的新增。
以及子类的重写。
3、如果声明了一个父类类型的引用(=左边),但是实际上指向了一个子类对象。(=右边)
可以访问父类的属性和方法。
以及子类重写的方法。但是不能访问子类的新增。
3.3对象的多态性的应用
如果一个方法,接收了父类类型作为参数,那么实际上传入父类对象和其他的任意子类对象都可以。
如果传入子类对象的话,会发生对象的向上转型。
3.4、abstract关键字
1、可以修饰方法:表示该方法是抽象的,该方法没有方法体。
abstract修饰的方法,表示抽象的方法。没有方法体。
2、可以修饰类:表示该类是抽象的?该类就不能被实例化(不能创建对象)。
如果一个类中,包含了至少一个抽象方法。那么该类也必须是抽象的。抽象类必须要有子类继承,并重写这个抽象方法。如果子类没有实现这个抽象方法,那么子类也是抽象的,再等待子类来继承并重写。









网友评论