一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构…
关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 2.随着类的加载而执行,而且只执行一次 先说一下类加载,一个程序要想运行,首先要把代码加载到内存中,然后才能去和CPU交流,这是冯诺依曼计算机规定的.Java也是一样,Java的.class字节码文件要想执行,首先也…
总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数. ================================================================================ 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个, 一般在代码块中对一些static变量…
Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { private static String msg = "GeeksForGeeks"; public static class NestedStaticClass { public void printMessage() { System.out.println("Message…
ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变量叫做静态变量,有其特殊的作用.在java中static也用来修饰静态方法和静态内部类. 静态变量的特点: (1)生存周期:静态局部变量的生存周期也是整个源程序.当定义整个变量的函数结束时,整个变量并没有消失,他始终是存在的. (2)作用域:作用域与自动变量是一样的,只能在定义其的子函数中使用,当退…
子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu…
在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码块…
静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静态代码块: {} 执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量.非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行. 例程: public class Test1 { public static Str…
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. synchronized关键字可以修饰方法,可以修饰代码块,但不能修饰构造器.属性等. 对synchronized(this)的一些理解 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这…
静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执行一次. 示例代码 package demoTest; public class Order { public static void main(String[] args) { Order order1 = new Order(); { System.out.println("不是");…
子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器.子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器.如果父类的构造器被重载,那么子类中的构造器也必须初始化父类的构造器,否则会报编译错误.当然,只要父类中显示定义了空构造器,子类中就不必初始化父类的构造器.例如:父类Person.java package myjava; public class Person { private String name;…
其实我们发现子类继承父类操作很简单,如果要是去深入的研究下会发现,实例化过程并非是我们看到的那样,我们就以代码举例来说明: 问大家,以下代码执行会输出什么呢? package com.oop; /** * 定义动物对象 * @author Liudeli * */ class Animal { public Animal() { System.out.println("Animal()--构造函数"); } } /** * 定义狗对象 * @author Liudeli * */ cl…
子类转父类 (父类引用指向子类对象) 子类可以转换为父类,如下父类FruitTest与其子类AppleTest class FruitTest { String str = "FruitTest"; public String get() {return str;} public void set(String str) {this.str = str;} } class AppleTest extends FruitTest { String str = "AppleTes…
1.子父类中的构造函数不存在重写,因为子父类的构造函数名字不一样(重写要求子父类的方法名字一模一样,包括参数列表)2.子类创建对象时会先运行父类的构造函数再运行子类的构造函数.因为每个子类的构造函数的第一行都会默认有一句隐式语句super()调用父类默认的构造函数:当要指定运行父类某个构造函数时,要手动添加对应的super(参数列表)3.super()语句与this()语句的用法一样      this(参数列表)语句调用的是本类中对应的构造函数//this语句只能定义在构造函数的第一行    …
原文:http://ini.iteye.com/blog/2007835 面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是 (静态变量.静态初始化块)>(变量.初始化块)>构…
原文:https://blog.csdn.net/u014723529/article/details/70574026 /** * 获取实体类型名称 * 子类可覆盖此方法,返回:泛型T的类名.class.getSimpleName() * @return */ protected String getModelName() { Type t = getClass().getGenericSuperclass(); ParameterizedType p = (ParameterizedType…
public class Test { class Super { int flag = 1; Super() { test(); } void test() { System.out.println("Super.test() flag=" + flag); } } class Sub extends Super { Sub(int i) { flag = i; System.out.println("Sub.Sub()flag=" + flag); } void…
public class Student { private String name; private int age; private int id; public Student() {  super(); } public Student(String name, int age, int id) {  super();  this.name = name;  this.age = age;  this.id = id; } public String getName() {  retur…
1.内部类定义 内部类在维基百科的定义为:  面向对象编程中,内部类(又叫做嵌套类)是在另一个类或者接口中进行声明的类.内部类不同于子类(subclass).(译者注:wiki的注解有误,内部类和嵌套类并不完全等同,详见下文.) 在Java中,上面的定义可以如下示例: public final class Clazz { private final class InnerClazz implements Runnable { public InnerClazz() { } @Override p…
Java虚拟机的内存分区:Java栈.堆.方法区.本地方法栈.PC寄存器.还有一个常量池的概念,虚拟机会为每种类型分配一个常量池,而不是实例. 例如有一个类有很多子类,那么在父类定义的final变量,在子类是不能被改变的.可以说明是在类型上分配的. 被static修饰的变量或者方法是属于类本身,而不属于类的实例.在类被加载进虚拟机的时候就已经初始化了,他存在与方法区,方法区和堆区的时候是共享的,因此他被设计为线程安全的.假设同时有两个线程都企图访问一个名为A的类,而这个类还没有被转入虚拟机,此时…
Java(静态)变量.(静态)代码块.构造方法的执行顺序 总结 1.父类静态变量和静态代码块(先声明的先执行); 2.子类静态变量和静态代码块(先声明的先执行); 3.父类的变量和代码块(先声明的先执行); 4.父类的构造方法; 5.子类的变量和代码块(先声明的先执行); 6.子类的构造方法. 注意事项 1.非静态代码块于构造方法之前执行,并且每次实例化对象之前都会先执行非静态代码块,静态代码块于非静态代码块之前执行; 2.在类第一次被调用时,加载该类,静态代码块只执行一次; 3.静态代码块只能…
众所周知在JAVA编程语言中有两种初始化块:   静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别   静态初始化块 定义:           static{}   执行优先级高于非静态的初始化块,它会在对象装载到系统的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员.它将在类加载时被执行.   执行优先级:1   非静态初始化块 定义:           {}   执行的时候如果有静态初始化块,先执…
类中存在两种特殊的代码块,即非静态代码块和静态代码块,前者是直接由 { } 括起来的代码,而后者是由 static{ } 括起来的代码. 非静态代码块在类初始化创建实例时,将会被提取到类的构造器中执行,但是,非静态代码块会比构造器中的代码块先被执行.…
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. class A { static { System.out.println("Static init A."); } { Sys…
本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java package org.yanzi.test1; public abstract class Server { private static final int DEFAULT_PORT = 900; public Server() { // TODO Auto-generated constructo…
总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数. 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值. 不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法). 静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每…
非静态代码块: TestOrder: package com.aff.singleton; /* 类的第四个成员:初始化块(代码块) 代码块: 如果有修饰的话只能使用static 分类:非静态代码块:1.可以对类的属性(静态&非静态)进行初始化操作,同时可以调用本类声明的方法(静态&非静态) 2.里面可以有输出语句 3.一个类中可以有多个非静态代码块,多个代码块之间按顺序结构执行 4.每创建一个类的对象,非静态代码块就会加载一次 5.非静态代码块的执行要早于构造器 静态代码块:1.里面可以…
内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { class B { public void shout1() { System.out.println(i); } } B b = new B(); b.shout1(); } public static void main(String[] args) { A a = new A(); a.shout…
1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: 构造器与类同名. 每个类可以有1个或多个构造器. 构造器可以有0个或多个参数. 构造器没有返回值. 构造器总是伴随着new操作一起调用. 如果在类中定义了一个final实例域,就意味着这个实例域只能被初始化一次,那么它必须在构造器中给予初始化. 如果在多个构造器中都需要给类的一个实例域初始化成同一…
可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested Classes):使用static声明,一般称为嵌套类(Nested Classes): 非静态嵌套类(Non-static Nested Classes):非static声明,一般称为内部类(Inner Classes): 嵌套类是它的外部类的成员.非静态嵌套类(内部类)可以访问外部类的其他成员…