JAVA类与对象(课堂总结)

一:“==”的不同含义

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

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package test;
 
public class qq {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Foo obj1=new Foo();
        Foo obj2=new Foo();
        System.out.println(obj1==obj2);
 
    }
 
}
class Foo{
    int value=100;
}

 结果是false。

分析:例子中含义是判断这两个变量是否引用同一对象,因为例子中定义的是两个不同的对象,所以返回false。

二:类的构造方法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test;
 
public class qq {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Foo obj1=new Foo();
    }
 
}
class Foo{
    int valud;
    public Foo(int initValue)
    value=initValue;
}

 分析:程序报错,原因因为自定义了构造方法,系统不再提供默认构造方法。

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

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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();
         
 
    }
}

 结果截图:

分析:

首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

四:在静态方法中访问类的实例成员

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package test;
 
public class qq
 {
  int x = 3;//类的实例变量,初始化值为3
  static int  y = 4;//类的静态变量,初始化值为4
  public static void method()//静态方法
  {  
    System.out.println("实例变量x = " + new qq().x);//在静态方法中访问类的实例变量需首先进行类的实例化
    System.out.println("静态变量y = " + y);//在静态方法中可直接访问类的静态变量
   }
  
  public static void main(String[] args)
     {
          qq.method();
         qq ex = new qq();
        System.out.println("x = " + ex.x);
    }
}

 五:Java字段初始化的规律

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package test;
 
public class qq {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
InitialzeBlockClass obj=new InitialzeBlockClass();
System.out.println(obj.field);
obj=new InitialzeBlockClass(300);
System.out.println(obj.field);
    }
 
}
class InitialzeBlockClass{
    {
        field=200;
    }
    public int field=100;
    public InitialzeBlockClass(int value){
        this.field=value;
    }
    public InitialzeBlockClass(){
         
    }
}

 实验结果截图:

分析(Java字段初始化规律):所有类的变量都默认初始化为null,比如String a; Integer b;数字类的原始数据类型默认初始化为0,比如int a; short b; char c;boolean默认初始化为false;

类加载时直接初始化静态字段;

类加载时调用静态方法初始化静态字段;

实例化对象时,在调用构造函数之前代码块中初始化字段;

实例化对象时,在调用构造函数之时初始化字段;

 

 

posted @   Java民工陆小凤  阅读(241)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示