• 类与对象 动手动脑


    使用类的静态字段与构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”

    public class Track {
        
        static private int count=0;
        
        Track(){
            count++;
        }
        
        public static void inquries(){
            System.out.println("现已创建对象"+count+"个");
        }
        
    }
    Track

    以下代码为何无法通过编译?哪儿出错了?

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

    如果类提供了一个自定义的构造方法,系统将不再提供默认构造方法

    使用上页幻灯片中定义的类,以下代码的输出结果是什么?

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

    请根据代码的输出结果,自行总结Java字段初始化的规律

    运行截图:

    执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。

    请运行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();
            
    
        }
    }
    TestStaticInitializeBlock.java

    运行截图:

    先执行父类的静态初始化块,再执行该类的初始化块

    静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

    请编写代码验证你的想法。

    public class SteadyState {
        
        private int value;
        
        public static void method( SteadyState a){
            SteadyState b = new SteadyState(100);
            b=a;
            System.out.println("b.value="+b.value);
        }
        
        SteadyState(int value){
            this.value = value;
        }
        
        public static void main( String[] args){
            SteadyState a = new SteadyState(500);
            SteadyState.method(a);
        }
        
    }
    SteadyState.java

    运行截图:

    先实例化类,得到一个实例变量,将要使用的类作为参数传给静态方法

  • 相关阅读:
    周4早上搜索引擎分析 crmim.com| MSCRM开发者之家
    Bat命令学习
    sqlserver日期函数
    ubunto应用软件
    sql for xml
    win7x64 连接oracle 客户端 vs 2010调试 提示“ORA12154: TNS: 无法解析指定的连接标识符 ”ORA06413 问题(转)
    CentOS Rsync服务端与Windows cwRsync客户端实现数据同步
    怎么引导2岁孩子洗手问题
    Libnfcinstallation
    Asterisk资料
  • 原文地址:https://www.cnblogs.com/gothic-death/p/9826007.html
Copyright © 2020-2023  润新知