0
点赞
收藏
分享

微信扫一扫

类和对象——基础篇

船长_Kevin 2022-04-13 阅读 95
java

目录

类的第二个作用:构造对象的模板

类的定义

类的实例化

属性的初始化规则

this 用法(当前对象的引用)

getter 和 setter

方法

内部类

static 在语法上出现的地方

变量

深浅拷贝


类的第二个作用:构造对象的模板

类的定义

                  

                 注意: 

                      (1)类名采用大驼峰定义

                      (2)成员前写法统一为public

                      (3)此处写的方法不带 static 关键字.

             

 

类的实例化

          用类类型创建对象的过程

          注:

            (1)new 关键字用于创建一个对象的实例.

            (2)使用 . 来访问对象中的属性和方法.

            (3)同一个类可以创建多个实例. 实例化出的对象 占用实际的物理空间,存储类成员变量

属性的初始化规则

        (1)默认值规则

        (2)就地(定义时)初始化:在声明成员变量时,就直接给出了初始值。

                     

        (3)构造方法规则(构造器)

                 • 名字必须与类名相同

                 • 没有返回值类型,设置为void也不行

                 • 创建对象时由编译器自动根据参数列表调用,并且在对象的生命周期内只调用一次

                 • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

                 • 如果没有显式定义,编译器会生成一份默认的构造方法(无参的)。

                 • 一旦用户显式定义,编译器不再生成无参构造方法

       (4)构造代码块:可出现在类的内部,方法的外部,用{}括起来。发生在对象的实例化过程

执行顺序:

             (1)默认值

             (2)定义时初始化和构造代码块按照书写顺序

             (3)构造器

 

this 用法(当前对象的引用)

       (1)引用类型参数

               •  this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

               •  this 只能在"成员方法"中使用

               •  在"成员方法"中,this 只能引用当前对象,不能再引用其他对象,具有 final 属性

               •  this 是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器

                   会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收

       (2)通过 this 调用本类其他构造方法来简化代码

               •  this (...) 必须是构造方法中第一条语句

               •  不能形成环

 

getter 和 setter

               

 

方法

        (1)静态方法(类方法):加 static,不能访问属性,不可以使用 this

        (2)普通方法(实例方法):不加 static,可以访问属性,可以使用 this

                  实例方法的调用必须依赖一个对象(通过引用)

                       

        (3)静态方法与普通方法的区别

                 

                  静态方法和普通方法的区域:方法区

                  静态方法不能调用普通方法不是绝对的,只要有对象(this)的存在,就可以调用

                  关于 static:加了 static 后就和类有关,与本类的对象无关

内部类

       (1)在 Java 中,可以将一个类定义在另一个类或一个方法的内部,前者称为内部类,后者

                称为外部类

                                      

                  注:

                      •  定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类

                      •  内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的

                          字节码文件

      (2)根据内部类定义的位置不同,一般可以分为以下几种形式:

                •  成员内部类:类内方法外位置定义(普通内部类:被static修饰的成员内部类 和 静态内

                   部类:未被static修饰的成员内部类)

                •  局部内部类(不谈修饰符):方法内位置定义、匿名内部类

       (3)普通内部类

                •  外部类中的任何成员都可以被在普通内部类方法中直接访问

                •  普通内部类所处的成员与外部类成员位置相同,因此也受public、private等访问限定符

                    的约束

                •  在内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成

                    员,必须:外部类名称.this.同名成员 来访问

                •  普通内部类对象必须在先有外部类对象前提下才能创建

                •  普通内部类的非静态方法中包含了一个指向外部类对象的引用

                •  外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建外部类的对象。

       (4)静态内部类

                •  在内部类中只能访问外部类中的静态成员

                •  创建内部类对象时,不需要先创建外部类对象

                •  成员内部类,经过编译之后会生成独立的字节码文件,命名格式为:外部类名称$内部

                   类名称      

       (5)局部内部类

                 定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非

                 常少,

                 •  局部内部类只能在所定义的方法体内部使用

                 •  不能被public、static等修饰符修饰

                 •  编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是

                    一个整数。

       (6)匿名内部类

static 在语法上出现的地方

        (1)出现在类的内部 && 不是方法的内部

        (2)修饰属性(静态属性)方法(静态方法) 内部类(静态内部类)代码块(静态代码块)

        (3)静态导入

                        

变量

      (1)局部变量

               生命周期:与方法的运行有关

               区域:栈帧 -> 栈区

      (2)类变量、静态变量、静态属性

               生命周期:与类的加载、卸载有关

               区域:类 -> 方法区

      (3)实例变量、属性

                生命周期:与对象的实例化有关

                区域:对象 -> 堆区

深浅拷贝

    例: DateTime source = new DateTime(…);   对DateTime 对象复制

             方法 1:

                         DateTime dest = source;

                          不可以,只是创建了一个新的引用,指向源对象

             方法 2:

                         DateTime dest = source.copy();

                        

                        不可以,this 是当前对象的引用,本质上同方法 1

            方法 3:

                        DateTime dest = source.copy();

                     

                       完成了对象的复制,dest、source指向了不同的对象

                       浅拷贝复制:变量指纹不同

                       

                方法 4:深拷贝

                               DateTime dest = source.copy();

                              

举报

相关推荐

0 条评论