发表于: 2019-11-12 23:03:57

1 1077


JDK安装:https://blog.csdn.net/qq_42815754/article/details/82968464

配置文件加上:

export JAVA_HOME=/java/jdk1.8.0_221

export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ 

export PATH=$PATH:$JAVA_HOME/bin

mysql的血泪安装:

https://blog.csdn.net/wwd0501/article/details/71171614

https://www.cnblogs.com/Can-daydayup/p/10877500.html

https://blog.csdn.net/qq_33105209/article/details/89421533

https://www.cnblogs.com/Jesse8/p/8042259.html(LINUX命令)

https://blog.csdn.net/superchanon/article/details/8546254

这些都试过了。各种BUG报错。建议避坑

最后选择RPM方式非常流畅,强烈建议萌新选择这种方式

但是这种方式不能自己选择各种配置文件的位置 自动生成

RPM安装方式文件分布:

远程连接

-----------------------------------基础学习分割线---------------------------------------------------------------

父子类的调用

class X {

Y b = new Y();

X() {

System.out.println("X");



class Y {

Y() {

System.out.println("Y");



public class Z extends X {

Y y = new Y();

Z() {

super();

System.out.println("Z");

}

public static void main(String[] args) {

new Z(); 



1.new Z();先要为Z开辟内存空间,创建属性Y y 此时y的值为null,

接着调用Z的构造方法,因为在构造方法内部有隐含的super(),所以先调用父类的

构造方法,因为父类中有属性Y b 初始时为null,所以先为b进行显示初始化,执行

new Y();此时调用Y的构造方法,打印Y

2.接着调用父类的构造方法X();输出X

上面说明父类:要先进行成员变量的显示初始化,在进行构造方法的初始化


3.为子类的成员变量y赋值,执行new Y();调用Y的构造方法,输出 Y

4.执行子类Z中调用super()语句后的语句,输出Z

所以答案为YXYZ

总结:不管是子类还是父类都要先执行成员变量的显示初始化,再执行构造方法初始化

================================================================================

class Father extends Object {

public Father() {

//super();

System.out.println("Father 的构造方法");

}


class Son extends Father {

public Son() {

super(); //这是一条语句,如果不写,系统会默认加上,用来访问父类中的空参构造

System.out.println("Son 的构造方法");

}

public class Demo5_Extends {

public static void main(String[] args) {

Son s = new Son();

}

==================================================================================

/*

* 结果:Y1X1W1Z1

* */

class X1 {

Y1 b = new Y1();

X1() {

//System.out.println(this.getClass().getSimpleName()+"------------------");

System.out.println("X1");

}

static{

System.out.println("加载X1类");

}

}

class Y1 {

Y1() {

//System.out.println(this.getClass().getSimpleName()+"...............");

System.out.println("Y1");

}

}

class W1 {

W1() {

//System.out.println(this.getClass().getSimpleName()+"...............");

System.out.println("W1");

}

}

public class Z1 extends X1 {

W1 w1 = new W1();

Z1() {

super();

System.out.println("Z1");

}

public static void main(String[] args) {

new Z1(); 

}

static{

System.out.println("加载Z1类");

}

}

对上述代码通过debug的总结:

1.该代码保存的文件名为"Z1",我们编译时执行的是javac Z1.java,运行的是java Z1,

此时要加载Z1,但是发现Z1有父类X1,所以要先加载X1类,而X1类中有静态代码块,所以输出"加载X1类"

注意:类的加载是为以后的使用做准备的,并不是加载的时候就执行类中的所有内容,只有类中的静态代码块在加载的时候才被执行,而且只执行一次

2.父类X1加载完毕后要加载子类Z1,而子类Z1中也有静态代码块,所以要执行子类Z1的静态代码块,所以输出"加载Z1类"

3.父类和子类加载完毕后,找到Z1类中的main方法,然后main方法进栈内存要执行,而此时第一句话是new Z1();表示要创建子类的Z1对象,

此时不会先执行子类的成员变量赋值和构造代码块,而是先执行super();通知父类X1做初始化工作,而父类中如果有成员变量和构造代码块(它俩属于同一级别,按先后顺序执行)的话要先执行,

而这里有成员变量的初始化Y1 b = new Y1();所以要调用Y1的构造方法,输出"Y1",接着执行父类X1的构造方法输出"X1",此时父类初始化工作完成

4.给子类Z1的成员变量W1 w1 = new W1();初始化,执行new W1();所以调用W1的构造方法,输出"W1",接下来说明super执行完毕,执行super之后的语句输出"Z1"

==================================================================================


class W {

{

System.out.println("W的构造代码块......10");

}

static {

System.out.println("W的静态代码块......9");

}

W() {

System.out.println("W的空参构造函数....11");



class Y {

{

System.out.println("Y的构造代码块.....4");

}

static {

System.out.println("Y的静态代码块.....3");

}

Y() {

System.out.println("Y的空参构造函数....5");


class X {

Y b = new Y();

{

System.out.println("X的构造代码块.....6");

}

static {

System.out.println("X的静态代码块.....1");

}

X() {

System.out.println("X的空参构造函数....7");


public class Z extends X { 

{

System.out.println("Z的构造代码块......8");

}

static {

System.out.println("Z的静态代码块......2");

}

Z() {

super();

System.out.println("Z的空参构造函数....12");

}

W w = new W();

public static void main(String[] args) {

new Z(); 


关于上面的代码的运行流程:

1.此代码文件保存为"Z"(有main方法),而Z继承了X,所以首先加载X类,而在X类中有静态代码块,所以输出"X的静态代码块.....1"

2.加载类Z,因为Z中有静态代码块,所以输出"Z的静态代码块......2"

3.执行Z的空参构造函数中super()通知父类进行初始化操作,而在父类(X类)中有引用类型的成员变量、构造代码块(它们俩按照先后顺序执行)、构造方法

a.为X类中引用变量b执行初始化操作,b=new Y();此时要加载类Y

(1)加载类Y执行Y类中的静态代码块,所以输出"Y的静态代码块.....3"

(2)执行Y类中的构造代码块,所以输出"Y的构造代码块.....4"

(3)执行Y类中的空参构造函数,所以输出"Y的空参构造函数....5"

b.执行X类中的构造代码块,所以输出"X的构造代码块.....6"

c.执行X类中的构造函数,所以输出"X的空参构造函数....7"

4.父类初始化完毕(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)后,并不会直接执行super()后面的内容,而是要对子类Z按照上面的

顺序进行初始化(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)

a.子类X构造代码块在上面,所以先执行,输出"Z的构造代码块......8"

b.为Z类Z的成员变量w赋值w=new W(),所以要现加载W

(1)加载类W,执行其中的静态代码块,所以输出"W的静态代码块......9"

(2)创建W的对象,所以先执行W的构造代码块,输出"W的构造代码块......10"

(3)执行W的构造方法,所以输出"W的空参构造函数....11"

c.接着执行super()后面的内容,所以输出"Z的空参构造函数....12"

1.加载class文件时,如果有继承关系,要先加载父类的class文件
2.子类初始化之前,要先完成父类的初始化
3.成员变量(引用型)的初始化和和构造代码块的初始化,谁在前谁先执行==================================================================================
明天的计划:

重写一个Mybatis和Spring mvc 增删改查的程序然后放在服务器上跑通 把调试和测试一起在代码里熟悉


返回列表 返回列表
评论

    分享到