多态、类初始化、实例初始化学习

This commit is contained in:
dingjiawen 2022-09-20 18:19:06 +08:00
parent 2e5f398de6
commit 4b73b4cb59
3 changed files with 241 additions and 0 deletions

View File

@ -0,0 +1,120 @@
package com.markilue.java_learning.mutiType;
import org.junit.Test;
/**
* @BelongsProject: java_learning
* @BelongsPackage: com.markilue.java_learning.mutiType
* @Author: dingjiawen
* @CreateTime: 2022-09-20 17:35
* @Description:
* TODO 测试实例初始化
* 1)初始化顺序:
* 1super()或super(实参列表) 这里选择哪个看原来构造器首行是哪句没写默认就是super()
* 2非静态实例变量的显示赋值语句
* 3非静态代码块
* 4对应构造器中的代码
* 特别说明其中23是按顺序合并的1一定在最前面4一定在最后面
* 2)执行特点
* 1.创建对象时才会执行
* 2.调用哪个构造器就是指定它对应的实例初始化方法
* 3.创建子类对象时父类对应的实例初始化会被先执行执行父类哪个实例初始化方法看用super()还是super(实参列表)
* 3)非静态代码块和构造器
* 1.从某种程度上来看非静态代码块是对构造器的补充非静态代码块总是在构造器执行之前执行
* 与构造器不同的是非静态代码块是一段固定执行的代码它不能接收任何参数
* 因此非静态代码块对同一个类的所有对象所进行的初始化处理完全相同
* 基于这个原因不难发现非静态代码块的基本用法:如果有一段初始化处理代码对所有对象完全相同且无须接收任何参数就可以把这段初始化处理代码提取到非静态代码块中
* 2.即如果每个构造器中有相同的初始化代码且这些初始化代码无须接收参数就可以把它们放在非静态代码块中定义
* 通过把多个构造器中相同代码提取到非静态代码块中定义能更好地提高初始代码的复用提高整个应用的可维护性
* @Version: 1.0
*/
public class InitTest {
//测试子父类继承方法有重写时初始化顺序
@Test
public void test(){
Son s1 = new Son();
System.out.println("-----------------------------");
Son s2 = new Son("atguigu");
/*
运行结果
Son:getNumber() //子类重写getNumber()方法那么创建子类的对象就是调用子类的getNumber()方法因为当前对象this是子类的对象
Father(1)
Son:getNumber()
Father(2)
Father()无参构造
Son:getNumber()
Son(1)
Son:getNumber()
Son(2)
Son()无参构造
-----------------------------
Son:getNumber()
Father(1)
Son:getNumber()
Father(2)
Father(info)有参构造
Son:getNumber()
Son(1)
Son:getNumber()
Son(2)
Son(info)有参构造
*/
}
private class Father{
private int a = getNumber();
private String info;
{
System.out.println("Father(1)");
}
Father(){
System.out.println("Father()无参构造");
}
Father(String info){
this.info = info;
System.out.println("Father(info)有参构造");
}
private int b = getNumber();
{
System.out.println("Father(2)");
}
public int getNumber(){
System.out.println("Father:getNumber()");
return 1;
}
}
private class Son extends Father {
private int a = getNumber();
{
System.out.println("Son(1)");
}
private int b = getNumber();
{
System.out.println("Son(2)");
}
public Son(){
System.out.println("Son():无参构造");
}
public Son(String info){
super(info);
System.out.println("Son(info):有参构造");
}
public int getNumber(){
System.out.println("Son:getNumber()");
return 1;
}
}
}

View File

@ -0,0 +1,46 @@
package com.markilue.java_learning.mutiType;
import org.junit.Test;
/**
* @BelongsProject: java_learning
* @BelongsPackage: com.markilue.java_learning.mutiType
* @Author: dingjiawen
* @CreateTime: 2022-09-20 16:50
* @Description: TODO 测试多态的特性:
* 1)属性没有多态
* 2)静态方法没有多态性
* 1.静态方法不能被重写
* 2.调用静态方法最好使用类名.
* @Version: 1.0
*/
public class StaticTest {
//测试静态方法没有多态性
@Test
public void test() {
Father f = new Son();
f.test();//只看编译时类型 =>father
}
//测试属性没有多态性
@Test
public void test1() {
Father f = new Son();
System.out.println(f.x);//只看编译时类型 =>1
}
}
class Father {
int x=1;
public static void test() {
System.out.println("father");
}
}
class Son extends Father {
int x=2;
public static void test() {
System.out.println("son");
}
}

View File

@ -0,0 +1,75 @@
package com.markilue.java_learning.mutiType;
import org.junit.Test;
/**
* @BelongsProject: java_learning
* @BelongsPackage: com.markilue.java_learning.mutiType
* @Author: dingjiawen
* @CreateTime: 2022-09-20 17:43
* @Description:
* TODO 测试类初始化和实例初始化:
* 1)类初始化肯定优先于实例初始化
* 2)类初始化只做一次
* 3)实例初始化是每次创建对象都要进行
*
* @Version: 1.0
*/
public class clinitAndInitTest {
public static void main(String[] args) {
Son s1 = new Son();
System.out.println("----------------------------");
Son s2 = new Son();
/*
运行结果
Father:static
Son:static
Father:not_static
Father()无参构造
Son:not_static
Son()无参构造
----------------------------
Father:not_static
Father()无参构造
Son:not_static
Son()无参构造
*/
}
@Test
public void test(){
}
// private class Father{
// static{
// System.out.println("Father:static");
// }
// {
// System.out.println("Father:not_static");
// }
// Father(){
// System.out.println("Father()无参构造");
// }
// }
// private class Son extends Father{
// static{
// System.out.println("Son:static");
// }
// {
// System.out.println("Son:not_static");
// }
// Son(){
// System.out.println("Son()无参构造");
// }
// }
}