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);
        }
    }

    测试截图:

  • 相关阅读:
    17岁韩寒在CCTV《对话》舌战群吊的视频
    在线LaTex编辑器
    PowerShell 点滴记录
    程序阅读理解题目(高中语文版,附答案)
    jQuery Validate 应用
    ASP.net MVC 向子视图传递数据
    分库分表(sharding)后主键全局唯一性的解决方案
    Ajax局部刷新例子
    限制 Flash 在指定域名/网址中播放 (Flash 防盗链)
    javascript实现二级联动下拉框
  • 原文地址:https://www.cnblogs.com/hhjing/p/11689393.html
Copyright © 2011-2022 走看看