• 类与对象动手动脑


    一:

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

    二:

    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实例化的引用调用此类的方法。

  • 相关阅读:
    tomcat快速部署脚本
    Centos7下搭建单节点Zookeeper
    request的基本使用用法
    Centos7 下配置jdk
    oracle备份脚本(以日期命名文件夹)
    Centos7 关闭防火墙
    Centos7 配置静态ip地址
    杀死占用8080端口的进程
    git clone的时候遇到“Please make sure you have the correct access rights and the repository exists”
    【笔记】关于多分类问题中的混淆矩阵,精准率
  • 原文地址:https://www.cnblogs.com/hongniuke/p/4887457.html
Copyright © 2020-2023  润新知