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

    一:运行一下代码为何无法通过编译器,说明错误的原因

    package reserve;
    
    import javax.swing.text.StyledEditorKit.ForegroundAction;
    
    public class Main{
        public static void main(String[] args) {
            Foo obj1=new Foo();
        }
    }
    class Foo{
        int value;
        public Foo(int initValue) {
        value=initValue;
       }
    }

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

    二:运行下面的代码,根据输出结果,自行总结Java字段初始化的规律

    package reserve;
    
    import org.omg.CORBA.PUBLIC_MEMBER;
    
    public class Main {
        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.类的初始化块不接受任何的参数,而且只要一创建类的对象,他们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

    三:运行一下代码,总结出“静态初始化块的执行顺序”

    package reserve;
    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 Main
    {
        public static void main(String[] args) 
        {
            new Leaf();
            
    
        }
    }

    测试截图:

    静态初始化块的执行顺序:

    1.

    执行顺序:静态初始化块->初始化块->构造函数

    静态初始化块:在第一次加载类时执行,与对象的创建无关。

    构造代码块:在调用构造方法时执行。

    构造函数:在调用构造函数时执行。

    2.静态初始化块只执行一次

    3.创建子类型的对象时,也会导致父类型的静态初始化块的执行

    四:静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法),编写代码,验证自己的想法

    package reserve;
    public class Main{
        int a=1;//类的实例变量,初始化值为1
        static int b=2;//类的静态变量,初始化值为2
        public static void Method() //静态方法
        {
         System.out.println("实例变量a="+new Main().a);//在静态方法中访问类的实例变量需要首先进行类的实例化
         System.out.println("静态变量b="+b);//在类的方法中可以直接访问类的静态变量
        }
        public static void main(String[] args) {
            Main.Method();
            Main c=new Main();
            System.out.println("a="+c.a);
        }
    }

    测试截图:

  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/hhjing/p/11689393.html
Copyright © 2011-2022 走看看