• 类与对象动手动脑实践


    一、输入并运行以下代码,得到什么结果?

    package demo;
    
    public class test {
    
        public static void main(String[] args) {
            Foo obj1=new Foo();
            Foo obj2=new Foo();
            System.out.println(obj1==obj2);
        }
    }
    class Foo{
        int value=100;
    }

    没有输出,对象之间不能进行判断相等。

    二、以下代码为何不能通过编译,哪错了?

    public class test {
    
        public static void main(String[] args) {
            Foo obj1=new Foo();
        }
    }
    class Foo{
        int value;
        public Foo(int initValue);
        value=initValue;
    }

    因为类提供了构造方法,系统不在提供默认构造方法

    三、以下代码的输出结果是什么?

    public class test {
    
        public static void main(String[] args) {
            InitializeBlockClass obj=new InitializeBlockClass();
            System.out.println(obj.field);
            
            obj=new InitializeBlockClass(300);
            System.out.println(obj.field);
        }
    }
    class InitializeBlockClass{
        {
            field=200;
        }
        public int field=100;
        public InitializeBlockClass(int value)
        {
            this.field=value;
        }
        public InitializeBlockClass()
        {}
    }

    输出结果:

    java字段初始化规律:

    所有类的变量都默认初始化为null,比如String a; Integer b; 
    数字类的原始数据类型默认初始化为0,比如int a; short b; char c;
    boolean默认初始化为false;
    四、当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
    class Fulei{
        static {
            System.out.println("父类静态块");
        }
        public Fulei(){
            System.out.println("父类构造方法");
        }
    }
    
    class Zilei extends Fulei{
        static{
            System.out.println("子类静态块");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            new Zilei();
        }
    }
    
    

    创建子类对象时,父类静态初始化块也会执行


    五、请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
    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调用同一类中重载的构造器
            this();
            System.out.println("Mid的带参数构造器,其参数值:" + msg);
        }
    }
    class Leaf extends Mid
    {
        static{
            System.out.println("Leaf的静态初始化块");
        }
        {
            System.out.println("Leaf的普通初始化块");
        }    
        public Leaf()
        {
            //通过super调用父类中有一个字符串参数的构造器
            super("Java初始化顺序演示");
            System.out.println("执行Leaf的构造器");
        }
    
    }
    
    public class TestStaticInitializeBlock
    {
        public static void main(String[] args) 
        {
            new Leaf();
            
    
        }
    }

     验证截图:

     总结:

    如果定义初始化块时使用了static修饰符,则变成了静态初始化块。静态初始化块时类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到java.lang.Object类,先执行java.lang.Object类中的静态初始化块,然后执行其父类的静态初始化块,最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类,包括访问类method、类Field,或者用这个类来创建实例。

    六、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员

    public class Test {    
        protected String alpha;    
        public void top()
        {        
            System.out.println("1234");    
            }    
        public static void main(String[] args) 
        {            
            Test a = new Test();                   
            a.top();    
            }
        }

     在外部调用静态方法时,用"类名.方法名"的方式,实例方法用"对象名.方法名" 。如果静态方法中必须要调用非静态方法,可以先new(实例),之后通过new实例化的引用调用此类的方法。

    七、、不使用Eclipse,直接使用命令行运行Test1.java,Test2.Java,Test3.Java

    运行截图:

  • 相关阅读:
    vbr mp3
    NDK setup error
    转载 MPEG2视频解码在ARM11上的优化
    arm程序设计优化
    小情歌
    android update project
    Linux环境下的DNW使用
    2010的计划
    Setting up UDEV rules to grant access to your phone
    Debugging Native Code for android
  • 原文地址:https://www.cnblogs.com/lk0823/p/4888230.html
Copyright © 2020-2023  润新知