super注意点
super注意点: 1.super调用父类得构造器方法,必须在构造器方法得第一个 2.super必须只能出现在子类得方法或者构造方法中! 3.super和this不能同时调用构造方法! Vs this: 代表得对象不同: this: 本身调用这个对象 super: 代表父类对象得应用 前提 this:没用继承也可以使用 super:只能在继承条件下使用 构造方法 this():本类的构造 super():父类的构造 在子类如果想调用父类的无参构造器时,父类要写无参构造器,子类也可以直接调用父类的有参构造,在super里面直接加参数. 如果父类里面只有有参构造器,而没有无参构造器,子类无法调用父类的无参构造器 方法重写 //重写是方法的重写,与属性无关 public class B { //静态方法和非静态方法区别很大 //方法的调用之后,左边定义的数据类型有关 //非静态:重写 public void test(){ System.out.println("B-->test()"); } } 重写:需要在继承关系,子类重写父类的方法! 1.方法名必须相同 2.参数列表必须相同 3.修饰符:范围可以扩大,但不可以缩小:public>protected>default>private 4.抛出的异常:范围可以缩小,但是不能扩大 是在非静态方法下的 重写,子类的方法和父类必须要一致,方法体不同! 1.父类的功能,子类不一定需要,也不一定满足 alt+insert: override 在自动生成的重写方法上面会有一个注解 多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件
有继承关系
子类重写父类方法
父类引用指向子类对象
注意:多态是方法的多态,属性没有多态性。
instanceof:是用来判断两个类是否有联系的
/* 多态注意事项: 1. 多态是方法的多态,属性没用多态 2. 父类和子类,有联系,没有联系会类型转换异常! ClassCastException! 3. 存在条件: 继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son(); 1.static 方法,属于类,它不属于实例 2.final 常量 3.private方法 //一个对象的实际类型是确定的 //可以指向的引用类型就不确定了: 父类的引用指向子类 //子类 能调用的方法都是自己的或者继承父类的! Student s1 = new Student(); //父类 可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行哪些方法,主要看对象右边的类型,和右边关系不大 s2.run(); //子类重写了父类的方法,执行子类的方法 s1.run(); */ 类型转换 /* 1.父类引用指向子类的对象 2.把子类转换为父类,向上转型 3.把父类转换为子类,向下转型,强制转换,可能会丢失一些方法(说的是丢失子类特殊的方法) 4.方便方法的调用,减少重复的代码 */ /*//类型之间的转换: 父 子 //高 低 //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了! //子类转换为父类,可能丢失自己的本来的一些方法! Student student = new Student(); student.go();*/ static关键字被static修饰过之后,与类一起加载,所以被第一个调用
public class Teacher { //2 赋初始值 { System.out.println("匿名代码块"); } //1 只执行一次 static { System.out.println("静态代码块"); } //3 public Teacher(){ System.out.println("构造代码块"); } public static void main(String[] args) { Teacher teacher = new Teacher(); System.out.println("==================="); Teacher teacher2 = new Teacher(); } }静态导入包
//静态导入包 import static java.lang.Math.random; import static java.lang.Math.PI; public class Test { public static void main(String[] args) { System.out.println(random()); System.out.println(PI); } } 抽象类abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法 除非它自己也是一个抽象类 public class A extends Action{ @Override public void doSomething() { } } //abstract抽象类 单继承 {接口可以多继承} public abstract class Action { //约束~有人帮我们实现~ //abstract ,抽象方法 ,只有方法名,没用方法的实现 public abstract void doSomething(); //1.不能new这个抽象类,只能靠子类区实现它:约束! public void hello(){ }//抽象类中有普通方法是可以的 //2.抽象类中可以写普通的方法 //3.抽象方法必须在抽象类中 //抽象的抽象:约束 //思考? new,存在构造器么? //抽象类是存在构造器的,不然子类无法重写方法 //存在的意义 抽象出来~提高开发效率 } 接口普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有!
接口:只有规范!自己无法写方法专业的约束!约束和实现分离:面向接口编程