9.30动手动脑

class MyClass {
    // 公有字段
        public String Information = "";

        // 自定义公有Java实例方法
        public void myMethod(String argu) 
        {
            System.out.println(argu);
        }

        // 定义属性:私有字段+get方法+set方法
        private int value;
        public int getValue() 
        {
            return value;
        }
        public void setValue(int value) 
        {
            this.value = value;
        }
}
public class Text1 {

    public static void main(String[] args) 
    {
        //创建类的实例,定义一个对象变量引用这一实例
        MyClass obj = new MyClass();
        //通过对象变量调用类的公有方法
        obj.myMethod("Hello");
        //给属性赋值
        obj.setValue(100);
        //输出属性的当前值
        System.out.println(obj.getValue());
        //直接访问对象公有字段
        obj.Information = "Information";
        //输出对象公有字段的当前值
        System.out.println(obj.Information);
    }
}

运行结果:

Hello
100
Information

public class Txet2 {
public static void main(String []args) {
    int value1=100;
    int value2=100;
    System.out.println(value1==value2);
}
}

结果为:true

public class Txet2 {
public static void main(String []args) {
    MyClass c1=new MyClass();
    MyClass c2=new MyClass();
    System.out.println(c1==c2);
}
}
class MyClass {
    // 公有字段
        public String Information = "";

        // 自定义公有Java实例方法
        public void myMethod(String argu) 
        {
            System.out.println(argu);
        }

        // 定义属性:私有字段+get方法+set方法
        private int value;
        public int getValue() 
        {
            return value;
        }
        public void setValue(int value) 
        {
            this.value = value;
        }
}

结果为:false

原因是:

当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

public class Text3 {

    public static void main(String[] args) 
    {
        
        MyTestClass obj1=new MyTestClass(100);
        
        MyTestClass obj2=new MyTestClass(100);
                        System.out.println(obj1==obj2);
        
        System.out.println(obj1.equals(obj2));
    
    }
}
class MyTestClass

{
    
    public int Value;
    
    //注意:只有参数类型为Object的,才是重写了Object的equals方法
    
    //参数类型为MyTestClass的,仅仅是Overload了equals方法。
 
    //   @Override

    //   public boolean equals(Object obj)
    
//    {
    
//        return ((MyTestClass)obj).Value==this.Value;
    
//    }
    
   
        public boolean equals(MyTestClass obj)
   
        {
       
            return obj.Value==this.Value;
   
        }
    
        public MyTestClass(int initValue)
    
        {
        
            Value=initValue;
    
        }

}

结果为:

false
true

该方法称为类的“构造方法”,有时也习惯称为“构造函数”。
当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”。

 

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

public class Text4 {
    public static void main(String []args) {
        Intnate it=new Intnate();
        System.out.println(it.fi);
        it=new Intnate(300);
        System.out.println(it.fi);
    } 
}
class Intnate{
    {
        fi=200;
    }
    public int fi=100;
    public Intnate() {}
    public Intnate(int a) {
        this.fi=a;
    }
}

结果为:

100
300

执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

public class TextStatic {
    public static void main(String[] args) 
    {
        new Leaf();
        

    }
}

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的构造器");
    }

}

结果:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

静态初始化块的执行顺序:静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

类的静态方法只能访问静态成员。

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

public class Textjingtai {
    
         public static void main(String[] args)
            {
             T t=new T();
             t.gets();
            }
         
    }

class T {
    int x=3;
    static int  y=4;
    public static void gets()
     {  
      System.out.println("变量x = " + new T().x);
      System.out.println("变量y = " + y);
     }}

在静态方法中对该类进行实例化进行对实例变量的访问。

posted @ 2022-10-04 10:35  一个小虎牙  阅读(20)  评论(0编辑  收藏  举报