首页 > 其他 > 详细

main()和代码块

时间:2019-10-10 18:32:21      阅读:94      评论:0      收藏:0      [点我收藏+]

 

main方法

 * main()方法的使用说明
 * main方法是程序的主入口(一个主程序  先从main开始进行执行)
 *
 *
 * main方法也可以是一个普通的静态方法

 

 

代码块

代码块也是类的成员变量之一, 分为静态代码块和非静态代码块

 

static{  // 静态代码块



}


//非静态代码块

{

}

 

 * 类的成员之四: 代码块(或初始化代码块)  类的成员: 属性 方法 ,构造器 ,代码块
 * <p>
 * <p>
 * 1. 代码块的作用:  用来初始化类或对象
 * 2. 代码块如果有修饰的话, 只能使用static
 * 3. 分类: 静态代码块,非静态代码块

 

 

 

eg:

public class CodeBlock {
    public static void main(String[] args) {

        String desc = BlockPerson.desc;  //   当我是静态代码块
        BlockPerson blockPersonOnew = new BlockPerson();  //我是非静态代码块
    }

}


class BlockPerson {

    String name;
    int age;
    static String desc = "我是一个人";


    //构造器
    public BlockPerson() {
    }

    public BlockPerson(String name, int age) {
        this.name = name;
        this.age = age;
    }


    //代码块

    static{  //静态代码块  随着类的加载而加载
        System.out.println("我是静态代码块");

    }


    { //非静态代码块
        System.out.println("我是非静态代码块");

    }

    @Override
    public String toString() {
        return "Person[ name:"+name+"age:"+age+"]";
    }

    public static  void info(){
        System.out.println("我是一个人");
    }


}

 

 

 

非静态代码块可调用静态的方法和属性

    { //非静态代码块

        System.out.println("我是非静态代码块");
        age = 1;
        desc = "我是一个爱学习的人";  //非静态代码块可以调用静态结构
        info();

    }

 

 

 

静态代码块和非静态代码块的区别

4. 静态代码:
 *      > 内部可以有输出语句
 *      > 随着类的加载而执行,而且只执行一次
 *      > 初始化类的属性
 *      > 如果一个类中定义了多个静态代码块,按照声明的先后顺序执行
 *      > 静态代码块的执行要优先于非静态代码块执行(因为静态代码块是随着类的加载而执行,非静态是需要对象实例化后执行的)
 *      >静态代码块内只能调用静态的属性和方法 不能调用非静态的

 * 5. 非静态代码块
 *      > 内部可以有输出语句
 *      > 随着对象的创建而执行
 *      > 每创建一个对象就执行一次非静态代码块,只要类不重新加载就不会重新执行
 *      > 作用: 可以在创建对象是 对对象的属性赋值
 *      >  可以调用静态和非静态的属性和方法

 

对象赋值的方法:

对象赋值的方法:

* 对属性可以赋值的位置:
*      1. 默认初始化
*      2. 显示初始化   /  5. 在代码块中赋值(谁先写就先赋值谁)
*      3. 构造器初始化
*      4. 有了对象之后, 可以通过"对象.属性" 或" 对象.方法" 赋值
 顺序是: 1 >2 /5 > 3 >4 

eg:

public class OrderTest {
    public static void main(String[] args) {
        Rder rder = new Rder(); 
        System.out.println(rder.age);  //4

    }
}


class Rder{
    int age = 3; // 显示赋值
    {
        age = 4;
    }

}

 

 

 

对象赋值的

 

 

面试题:

此处,Something类的文件名叫OtherThing.java
class Something {
               public static void main(String[] something_to_do) {
               System.out.println("Do something ..."); }
}
上述程序是否可以正常编译、运行?

结果:

技术分享图片
可以编译运行,只不过无法输出语句 因为主类没有main方法主类没有执行
结果

 

 

 

 

 

练习题:

说出以下内容的执行结果:
class
Person { public static int total; static { total = 100; System.out.println("in static block!"); } } public class PersonTest { public static void main(String[] args) { System.out.println("total = " + Person.total); System.out.println("total = " + Person.total);
}
}

结果:

技术分享图片
因为静态代码块是随着类的加载而执行 因为类的加载优先于对象的创建 所以先执行静态代码块中的输出语句,然后再输出下面对面的调用的属性
in static block 
total=100 
total=100
结果

 

下面题目的输出是:

//总结: 由父及子,静态先行

public class LeftTest {
    public static void main(String[] args) {
        new Left();

    }
}


class Root {
    static {
        System.out.println("我是Root的静态代码块");
    }

    {
        System.out.println("我是Root的非静态代码块");

    }


    public Root() {
        System.out.println("我是Root的无参构造器");

    }
}


class Mid extends Root{
    static {
        System.out.println("我是Mid的静态代码块");

    }

    {
        System.out.println("我是Mid的非静态代码块");

    }


    public Mid() {
        System.out.println("我是Mid的无参构造器");
    }


    public Mid(String msg){
        this();
        System.out.println("Mid的参数构造器,参数是:msg:"+msg);
    }
}


class Left extends  Mid {
    static {
        System.out.println("我是Left的静态代码块");
    }

    {
        System.out.println("我是left的非静态代码块");
    }

    public Left() {
        System.out.println("我是left的无参构造器");
    }

    public Left(String msg){
        super();
        System.out.println("我是Left的参数构造器,参数是msg:"+msg);
    }

}

结果:

技术分享图片
     
         * 我是Root的静态代码块
         * 我是Mid的静态代码块
         * 我是Left的静态代码块
         * 我是Root的非静态代码块
         * 我是Root的无参构造器
         * 我是Mid的非静态代码块
         * 我是Mid的无参构造器
         * 我是left的非静态代码块
         * 我是left的无参构造器
结果

 

 

下面的输出是:

class FatherTest {
    static {
        System.out.println("111111");
    }

    {
        System.out.println(22222);
    }

    public FatherTest() {
        System.out.println(33333);
    }
}


public class SonTest extends FatherTest {

    static {
        System.out.println("44444444");
    }

    {
        System.out.println("55555555");
    }

    public static void main(String[] args) {
        System.out.println("777777777");
        System.out.println("**********");
        new SonTest();
        System.out.println("+++++++++++");
        new SonTest();
        System.out.println("========");
        new FatherTest();

    }
}

结果:

技术分享图片
111111
44444444
777777777
**********
22222
33333
55555555
+++++++++++
22222
33333
55555555
========
22222
33333
View Code

 

main()和代码块

原文:https://www.cnblogs.com/zhaoyunlong/p/11649554.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!