zoukankan      html  css  js  c++  java
  • 动手动脑二

    一丶

    int value=100;
    MyClass obj = new MyClass();
    这两种方式定义的变量是不一样的,第一种是原始数据类型定义的变量,而第二种是通过引用类名创建一个对象obj出来,obj称为对象变量。

    二丶对象变量判断相等

    int value1=100;

    intvalue2=100;

    System.out.println(value1==value2);//true

    对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等
    但是对于对象变量,无法用“==”来进行判断。

    public class ClassAndobject {
        public static void main(String[] args) {
            MyClass obj1=new MyClass();
            MyClass obj2=new MyClass();
            System.out.println(obj1==obj2);//false
        }

    class MyClass {
        int value=100;

    }

    引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

    如果要比较两个对象的内容是否一致,就意为字段一致的内容,用equals

    如上述内容可以把输出语句改为     

     1 package test3;
     2 
     3 public class ObjectEquals {
     4 
     5     public static void main(String[] args) {
     6         MyTestClass obj1=new MyTestClass(100);
     7         MyTestClass obj2=new MyTestClass(100);
     8         System.out.println(obj1.equals(obj2));
     9         System.out.println(obj1.Value);
    10         System.out.println(obj2.Value);
    11     }
    12 
    13 }
    14 class MyTestClass
    15 {
    16     public int Value;
    17     public boolean equals(MyTestClass obj)
    18     {
    19         return obj.Value==this.Value;
    20     }
    21     public MyTestClass(int initValue)
    22     {
    23         Value=initValue;
    24     }
    }
    三丶构造函数
       public MyTestClass(int initValue)
        {
            Value=initValue;
        }
    这个是类的构造函数,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
    如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”


    上述自定义了一个构造函数,那么系统就不会再提供默认的构造函数,所以错了。
    四丶类字段的初始化顺序
    package test3;
    public class InitializeBlockDemo {
    
        /**
         * @param args
         */
        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字段的初始值
        public int field=100;
        {
            field=200;
        }
        //public int field=100;
        public InitializeBlockClass(int value){
            this.field=value;
        }
        public InitializeBlockClass(){
            
        }
    }
    结果是:
    200
    300
    五丶
    package test3;
    
    
    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();
            
    
        }
    }
    结果:
    Root的静态初始化块 Mid的静态初始化块 Leaf的静态初始化块 Root的普通初始化块 Root的无参数的构造器 Mid的普通初始化块 Mid的无参数的构造器 Mid的带参数构造器,其参数值:Java初始化顺序演示 Leaf的普通初始化块 执行Leaf的构造器

    1 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行

    2 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;

    3 非静态初始化块的代码会在类构造函数之前执行

    六丶神奇的Integer

    package test3;
    
    public class StrangeIntegerBehavior 
    {
    
        
        public static void main(String[] args)
        {
    
            
            Integer i1=100;
           
            Integer j1=100;
            
            System.out.println(i1==j1);
    
            
            Integer i2=129;
            
            Integer j2=129;
            
            System.out.println(i2==j2);
        
        }
    
    
    }

    结果为true

              false

    非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

     
  • 相关阅读:
    用sql合并列,两句话合为一句
    微信公众平台中添加qq在线聊天代码
    我被7岁4岁的小姐妹狠狠教训了一番
    Yahoo News Digest(雅虎新闻摘要)APP的推出,未来的seo界又要受伤了
    新浪微博@别人字母不分大小写(微博昵称不分大小写)
    最近打算体验一下discuz,有不错的结构化数据插件
    使用css3来实现边框圆角效果
    用WP_Query自定义WordPress 主循环
    关闭火车头dedecms发布模块自动关键词,解决火车头发布dedecms文章关键词过多问题
    dedecms发布文章时多个Tag间分割逗号自动变成英文逗号
  • 原文地址:https://www.cnblogs.com/xcl666/p/9824489.html
Copyright © 2011-2022 走看看