目录
类的第二个作用:构造对象的模板
类的定义
注意:
(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();