黑马程序员技术交流社区
标题:
求救啊,我快要疯了!!!
[打印本页]
作者:
嘿~~
时间:
2014-4-17 09:13
标题:
求救啊,我快要疯了!!!
本帖最后由 嘿~~ 于 2014-4-17 11:12 编辑
静态代码块,普通代码块,静态构造函数,普通构造函数,成员变量(显示和隐式)执行顺序哪位高手能讲解一下吗????最好能给个代码说明一下啊,求救啊!!!这个弄不明白,我都没法往下看了!!
非常感谢大家,我快被这个执行顺序弄疯了!!!!!
作者:
月光海
时间:
2014-4-17 09:34
静态代码块是给类初始化的时候执行的,普通代码块是new对象的时候执行到,静态构造函数不可以用,普通构造函数是给对象初始化用的,成员变量的隐式赋值是早于构造函数,原因很简单,如果构造函数先执行了,然后再执行成员变量的隐式赋值,那构造函数的赋值就没有了。至于没有静态构造函数,构造函数是为了将一个类实例化一个对象才需要使用的,进行一些必备的初始化操作(即使你没写任何代码,实际上运行库也帮你添了很多操作)。何为静态,就是全局的,已经初始化过的,静态函数就是指该函数不和具体对象相关,只和类相关,但是构造函数是和对象直接关联的,这两个东西从面向对象的概念上完全不可能融合在一起。运行下我的代码就知道了,
package io.demo;
import java.util.Properties;
public class SystemDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Person("lisi",33);
p.name="zhangsan";
}
}
class Person
{
String name;
int age;
Person(String name,int age)
{
System.out.println("构造函数");
this.name=name;
this.age=age;
}
static
{
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
}
复制代码
作者:
⒈心只霸占沵
时间:
2014-4-17 09:43
class Person
{
public static String nationality;//国籍 静态成员
public String name;//姓名 非静态成员
public int age;
//静态代码块,用于初始化静态成员,或者要在类生成字节码时加载一些数据
//当把这个类加载到内存中时,调用,第一次用需要加载,第二次就不用了,所以只运行一次
static{
//-------------1------
nationality="china";//初始化静态成员
}
//静态构造函数,用于给所有Person的实例进行初始化,就是说当我们常见某个对象的实例时,如果没有指定姓名年龄,它就是张三,18
{
//-------------2------
name="张三";
age=18;
}
//显示构造函数,如果没写构造函数,默认隐式的为:public Person(){} 如果写了,隐式的就被覆盖了
public Person(String name,int age){
//------------3--------------
this.name=name;
this.age=age;
}
//如果没有写构造的话,默认的就是它,如果写了它就会被覆盖,所以如果Person p=new Person()这样就找不到无参构造,一般都会加上
public Person(){
--------------4--------------
}
}
class Test
{
//第一次创建对象时,需要将这个类加载到内存
Person p1=new Person();//因为是第一次用到Person,需要加载,说以会是 1,2,4
Person p2=new Person("王五",34);//因为不是第一次用到Persn,无需加载 ,1不在执行 顺序:2,3
}
复制代码
作者:
shi0000
时间:
2014-4-17 09:49
静态即表示属于类的,非静态的属于对象。
构造方法没有静态的。成员变量能够被public,private等修饰,当public修饰 时,表示在类外可以被直接
当private修饰时,被封装起来,外部不能直接访问
public class Exam {
private String name="lisi"; //私有化成员变量,外部调用时,只能采用下边的getName()方法
public String age="40"; //公有成员变量,可直接使用对象.age调用
static void show(){
System.out.println("属于类的静态show()");
} //静态 的,属于类,可以直接Exam.show()
Exam(){
} //在不写构造函数时,系统默认有一个无参构造方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Test{
public static void main(String[] args){
Exam e=new Exam();
Exam.show();
System.out.println(e.age);
}
}
作者:
491138002
时间:
2014-4-17 09:51
public class Demo {
Demo(){
System.out.println("构造方法");
}
{
System.out.println("构造代码块");//实例化对象的时候才会去调用!
}
static{
System.out.println("静态代码块");
}
public static void main(String[] args) {
new Demo();
new Demo();//再次创建对象,证明无论创建几次对象,静态代码块都只执行一次
System.out.println("普通代码块");
}
}
作者:
吴莫
时间:
2014-4-17 10:29
静态构造函数真心没听过,我也不明白啊,普通构造函数在创建有参的情况下,一般都建一个无参的构造函数。静态代码块只是在JVM加载类时,只执行一次;后面在创建对象new Person();也不会执行了。
作者:
skill20
时间:
2014-4-17 11:32
class Test1
{
/*private static int i=0;
public static int aMethod()
{
i++;
return i;
} */
public static void main(String[] args)
{
//Test1 test = new Test1();
Demo a = new Demo();
System.out.println("__________________");
Demo b = new Demo(50);
//Test1.aMethod();
//System.out.println(Test1.aMethod());
//System.out.println(a.getI());
//System.out.println(a.getI());
}
}
class Demo
{
private int age;
public int getI()
{
return age;
}
Demo()
{
System.out.println("无参数构造函数");
}
Demo(int age)
{
//if(age < 0 | age > 120)
System.out.println("构造函数代码块");
//else
this.age = age;
}
static
{
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
}
复制代码
运行下就可以了;非静态成员变量在构造函数前出初始化,静态成员变量随着类的加载而加载。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2