一、 构造方法和静态代码块
public class A {
static{System.out.print(1);}
public A(){System.out.print(2);}
}
public class B extends A{
static{System.out.print("a");}
public B(){System.out.print("b");}
}
public class C {
public static void main(String\[\] args){
A a = new B();
a = new B();
}
}
运行结果:1a2b2b
解析:
A a = new B();
会调用B的构造方法,默认在B构造方法开头调用super(),
也就是A();
A没加载,所以CLassLoader去加载A就会执行A中静态代码块,
然后执行A();
然后回到B构造方法继续走,发现B没加载,就会执行静态代码块,
然后再继续执行B();
再new一次B的时候,类加载不会再发生;
总结:其实静态代码块利用类加载的一次特性,还是经常能看见
1、父类子类都有构造方法和静态代码块的时候
父类静态代码块>父类构造函数>子类静态代码块>子类构造函数
二、重载和重写
区别:
1、重写是子类在父类已有功能的扩展,是多态特性的体现
2、重载是类内同一个名字的方法
3、形式上的区别
区别点 | 重载 | 重写 |
---|---|---|
参数列表 | 必须修改 | 必须相同 |
返回类型 | 可以修改 | 必须相同 |
异常 | 可以修改 | 只能抛出父类中定义好的异常 |
访问权限 | 可以修改 | >=父类 |
方法名 | 必须相同 | 必须相同 |
重载:参数次序、数量、类型
重写:抛出异常,不能抛出异常,不能父类方法抛出A异常,
子类方法抛出(B extends A)异常,相反也不能
class A {
static {System.out.print(1);}
public A() {System.out.print(2);}
public int D(int a ) {System.out.print(2);return 1;}
protected long D(int a,int b ) throws IllegalAccessException,IndexOutOfBoundsException
{return 10L;}
private float D(){return 0.1F;}
}
class B extends A {
static {System.out.print("a"); }
public B() {System.out.print("b");}
@Override
public int D(int a ) {return 1;}
@Override
protected long D(int a, int b ) throws {return 10L;}
//这里的异常必须是父类方法定义的异常
private float D() throws IndexOutOfBoundsException{
return 0.1F;}
private double D(int a,int k,long b) throws Exception{
return 0.1F;}
}
封装、继承、多态
面向对象
看待问题,解决问题的思维方式,着眼点在于找到一个能够帮助解决问题的实体,然后委托这个实体来解决问题
面向过程
着眼点在于问题是怎么一步步被解决的,然后亲力亲为的一步步的解决它
多态
1、多态的定义
允许不同类的对象对同一消息做出响应,
包括编译时多态,运行时多态
2、多态的作用
消除类型之间的耦合关系
3、多态的三个必要条件
继承、重写、父类引用指向子类对象
4、实现多态的技术
动态绑定,调用运行时类的方法
5、好处
1.简化性
简化对具体事物的处理逻辑的拆分
幼儿园化一点,策略模式到匿名内部类再到Lambda表达式
2、可替代性
对已存在代码具有可替换性
3、可扩充性
通过新增子类不影响已存在类的多态性
参考文章
[1] https://segmentfault.com/a/1190000021238707
[2] https://www.shsxt.com/it/java/683.html
[3] https://segmentfault.com/a/1190000012323629
[4] https://segmentfault.com/a/1190000018397324
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。