zoukankan      html  css  js  c++  java
  • 类与对象动手动脑

    一:

    这个类无法编译的原因是:提供了一个自定义的构造方法,导致系统不再提供默认构造方法。

    二:

    package Test;
    
    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;
    }

    理由:对象变量不能判断相等。

    三:

    package Chushihua;
    
    public class Chushihua {
     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()
        {}
    }

    类字段的初始化规律:1.执行类成员定义时指定的默认值或初始化块,到底执行哪一个要看哪一个排在前面。2:执行类的构造函数;

    初始化第一次是用了类的初始化块,第二次用了public的int初始化,所以第二次覆盖了第一次,输出100;在main 函数InitializeBlockClass赋初值300,所以覆盖100,输出的是300;

    四:

    当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。创建主类对象的时候,也把主类的父类初始化块执行了。

    五:

    package TestStaticInitializeBlock;
    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();
            
    
        }
    }

    静态块在第一个对象创建时运行,初始化块在每一个对象创建时运行,区别是静态块只执行一次,操作的内存在静态区,初始化块每个对象构造时都需要执行一次,操作的内村在用户区。

    六:

    package Testa;
    
    
    public class Testa{    
        protected String alpha;    
        public void dt()
        {        
            System.out.println("abcd");    
            }    
        public static void main(String[] args) 
        {            
            Testa t = new Testa();                   
            t.dt();    
            }
        }

    在外部调用静态方法时,可以使用“类名.方法名"的方式。也可以使用”对象名.方法名“的方式,而实例方法只有后面这种方式。如果静态方法中必须调用非静态方法。可以先new(实例),之后通过new实例化的引用调用此类的方法。

  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/hongniuke/p/4887457.html
Copyright © 2011-2022 走看看