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

    测试截图:

  • 相关阅读:
    ASP.Net在web.config中设置上传文件的大小方法
    asp.net利用QQ邮箱发送邮件,关键在于开启pop并设置授权码为发送密码
    ASP.NET中的几种弹出框提示基本实现方法
    asp.net 不用控件,自动登录(用于和其他系统对接的时候,自动登录系统,用户体验好)
    asp.net要验证的用户名和密码
    c#二维码建立与识别
    c#,读取二维码
    c#,条码
    JavaScript Dom 绑定事件
    JavaScript Dom0 Dom1
  • 原文地址:https://www.cnblogs.com/hhjing/p/11689393.html
Copyright © 2011-2022 走看看