对象属性初始化有3种

  1. 声明该属性的时候初始化
  2. 构造方法中初始化
  3. 初始化块

类属性初始化有2种

  1. 声明该属性的时候初始化
  2. 静态初始化块

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

练习-属性初始化

对象属性的初始化有三种方式
故意把初始化块,放在构造方法下面,问题:

这三种方式,谁先执行?谁后执行?

package charactor;public class Hero {public String name =Hero.getName("属性声明") ;public Hero(){name = Hero.getName("构造方法");}{name = Hero.getName("初始化块");}public static String getName(String pos){String result= "name "+pos;System.out.println(result);return result;}public static void main(String[] args) {new Hero();}}

=============================
解读静态代码块,构造代块和构造函数的先后顺序。
顺序:
初始化属性-->代码块-->构造函数

静态变量初始化 的 值 只跟随 最后一次 初始化

总结

静态类属性顺序: 1:静态声明 2:静态代码块
普通对象属性顺序:1: 属性声明 2:代码块 3:构造方法

public class Hero {public static int a=9;static{a=10;}public static void main(String[] args) {System.out.println(Hero.a);  //10}}
public class Hero {public String name ="1";public Hero(){name ="2";}{name="3";}public static void main(String[] args) {Hero hero = new Hero();System.out.println(hero.name);//输出2}
}

===============================
static 面试题

1.

至于为什么是这个结果,我们先不讨论,先来想一下这段代码具体的执行过程,在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。

笔记:static代码块 是先于static main()方法执行的, 它是在类加载时 就开始的。 比运行main()还要先
凡是涉及到类加载的时候,就要首先执行static代码块里的东西,如果有继承的话,再继续加载父类,执行父类里的代码块
类的成员属性初始化,再到普通代码块初始化,然后再到构造方法初始化
如果是静态的话, 静态成员属性初始化先,再到静态代码块初始化

这段代码的输出结果是什么?

public class Test {Person person = new Person("Test");static{System.out.println("test static");}public Test() {System.out.println("test constructor");}public static void main(String[] args) {new MyClass();}
}class Person{static{System.out.println("person static");}public Person(String str) {System.out.println("person "+str);}
}class MyClass extends Test {Person person = new Person("MyClass");static{System.out.println("myclass static");}public MyClass() {System.out.println("myclass constructor");}
}

类似地,我们还是来想一下这段代码的具体执行过程。首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

3.这段代码的输出结果是什么?

public class Test {static{System.out.println("test static 1");}public static void main(String[] args) {}static{System.out.println("test static 2");}
}

自己给自己个考题

package zsc.czy.object;public class Hero {public String name = "hahah";public Hero(){name ="2";}static{System.out.println("静态代码块");}{System.out.println(name);}public static void main(String[] args) {Hero hero = new Hero();}
}

输出:
静态代码块
hahah

package zsc.czy.object;public class Hero {public String name = "hahah";public Hero(){name ="2";}static{System.out.println("静态代码块");}{System.out.println(name);}public static void main(String[] args) {}
}

以上证明了:
1:在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Hero类,而在加载Hero类时,发现有static块,便执行了static块
2:每new XX() ; 就会加载这个XX类。如果加载XX类的时候发现XX类继承自AA类,因此会转去先加载AA类 ,这里发现有static块,便执行了static块
3:类在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量

自己弄的问题

package zsc.czy.object;public class Hero {public static Hero hero = new Hero();static {System.out.println("静态代码块");}public Hero(){System.out.println("被初始化了");}public static void main(String[] args) {}
}

说明了:执行main()方法前,先Hero类加载, 按顺序,先静态成员初始化,再执行静态代码块 ;

package zsc.czy.object;public class Hero {public static Hero hero = new Hero();static {System.out.println("静态代码块");}{System.out.println("普通代码块");}public Hero(){System.out.println("被初始化了");}public static void main(String[] args) {}
}

证实了:执行main()方法前,先Hero类加载, 按顺序,先静态成员初始化,执行有new 对象的语句,(顺序,先普通成员初始化,再普通代码块初始化,再到构造函数) 。完后再接着到执行静态代码块 ;

自己想出的题目

package zsc.czy.object;public class Hero {public static Hero hero = new Hero();static {System.out.println("静态代码块");}public String name ="1";{name="2";}public Hero(){System.out.println(name);}public static void main(String[] args) {}
}

自己出的题

package zsc.czy.object;public class B {public static String name="33";   static {   name = "2";}{System.out.println("普通代码块");}public B(){System.out.println("构造方法");}public static void main(String[] args) {System.out.println(B.name);}}

终极总结:

顺序, 静态成员初始化 -->静态代码块初始化 -->普通对象成员初始哈 -->普通代码块初始化-->构造方法初始化

转载于:https://www.cnblogs.com/czy16/p/8943793.html

java基础-对象-练习集锦相关推荐

  1. 10.66道经典的Java基础面试题集锦为何晴空

    "JavaPlanformStandardEdition"是Java语言的标准平台技术,是所有Java开发的语言基础,更是大数据.分布式开发思想建模的初期,此阶段的Java语义.语 ...

  2. java基础--日期--练习集锦

    题目1 --日期 借助随机数,创建一个从1995.1.1 00:00:00 到 1995.12.31 23:59:59 之间的随机日期 package date;import java.util.Da ...

  3. 经典的Java基础面试题集锦

    问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示"main方法不是public的". 问题:Java里的传引用和传值的区别是什么? 答案: ...

  4. ChatGPT 整理的 “Java基础面试题集锦:完全版“ (1)

    user: 你学习编程的目的是什么?学习编程最快的办法是什么? assistant: 我作为AI语言模型并不会有个人目的,但是就一般用户而言,学习编程的目的可以有很多种,比如为了就业.提高自己的技能水 ...

  5. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  6. [Java基础]对象(反)序列化流

    对象序列化流: 代码如下: package ObjectOutputStreamPack;import java.io.Serializable;public class Student implem ...

  7. java基础—对象转型

    一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...

  8. Java基础- 对象相等判断

    hashCode equals == 对象相等判断 equals和==区别 hashCode 与 equals(重要) ※※ hashCode()介绍 hashCode()介绍(常见的几个问题) 为什 ...

  9. Java基础----对象与类

    一.面向对象程序设计概述 面向对象程序设计(oop) 二.类 类(class)是构造对象模板或蓝图 由类构造(construct)对象的过程称为创建类的实例(instance) 封装是处理对象的一个重 ...

  10. java基础---对象锁和类锁的区别

    synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁. 对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同 ...

最新文章

  1. zuul 启动 threw exception_SpringCloud-Zuul-网关路由过滤器
  2. 为什么要设置环境变量,环境变量有什么用?
  3. 这几天都是在公司慢待
  4. 【AtCoder - 2554】Choose Integers (找规律,或枚举)
  5. IOC操作Bean管理XML方式(注入集合类型属性)
  6. 贪心法——部分背包问题
  7. HDU 1568 Fibonacci ★(取科学计数法)
  8. Python让你成为AI 绘画大师,简直太惊艳了!(附代码)
  9. Java 8新特性探究(五)重复注解(repeating annotations)
  10. 软件测试 -- 单元测试,集成测试,系统测试的侧重点
  11. Python实现答题程序
  12. 阿里云对象存储OSS
  13. 转载 编程新手入门
  14. 计算机网络(谢希仁第七版)期末重点
  15. Node开发后台API接口项目
  16. 零基28岁自学python入坑ing
  17. java入门软件安装教程,PDPS软件-安装入门教程 20200406
  18. kinhdown稳定版无法连接服务器,KinhDown稳定版
  19. 打开vivado的.xpr工程文件报错Cannot locate target loader
  20. 最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)

热门文章

  1. Windows注销后nginx.exe文件仍能继续运行
  2. H3C交换机设备使用QOS策略方式实现报文过滤
  3. 屏幕共享软件开发_工作生活离不开软件,你知道什么是免费软件与共享软件吗?...
  4. 刷题进阶 -- 剑指Offer、力扣算法题
  5. Python机器学习库——Sklearn
  6. 结构化和面向对象语言的区别
  7. 20170314--服务器监控
  8. Android应用自动更新功能代码实现
  9. myisam 与 innodb的区别,在什么情况下用什么ENGINE
  10. 从客户变成员工在租赁公司打工--我成为程序员所经历的(三)