对象在内存中的分配
- 栈:方法内定义的变量
- 堆(树形结构):new出来的结构(比如数组实体、对象实体)。包括对象中的属性
- 方法区:存放类的模板
c语言中内存分配(回忆)
- 变量、方法放栈,动态内存分配放堆,常量放静态区
类的成员之一:属性
变量的分类:
- 按照数据类型来分:基本数据类型,引用数据类型(数组、类、接口、枚举、注解、记录)
- 按照变量在类中声明的位置的不同:成员变量、局部变量(方法内、方法形参、构造器内)
属性的几个称谓
- 成员变量、属性、field(字段、域)
成员变量和局部变量区别
- 类中声明的位置不同
- 属性:声明在类内,方法外的变量
- 局部变量:声明方法、构造器内部的变量
- 在内存中分配的位置不同
- 属性:随着对象的创建存储在堆空间中
- 局部变量:栈
- 生命周期
- 属性:随着对象创建消亡
- 局部变量:随着方法对应的栈帧创建消亡
- 作用域
- 属性:在整个类的内部都是有效的
- 局部变量:仅限于声明此局部变量所在的方法(构造器、代码块)中
- 权限修饰符修饰
- 权限修饰符:public、protected、private(用于表明所修饰的结构可调用的范围的大小)
- 属性:可以使用
- 局部变量:不能使用
- 默认值
- 属性:都有默认初始化
- 局部变量:无
类的成员之二:方法
- java中方法必须依赖于类,即不能单独存在
对象数组
- 数组中元素位应用类型中的类时,称为对象数组
方法的应用
- 方法的重载
- 在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可
- 与权限修饰符和返回类型无关
- 可变个数形参的方法
- 权限修饰符 返回值类型 方法名 (参数类型 … 参数名)
- 可变个数形参的方法在调用时,针对形参的个数可以为0个1个多个
- 可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载
- 此种方法可以看为传递的是参数数组,只是不用new对象,访问参数时仍为参数名加下标号进行索引
- 可变个数的形参必须声明在形参列表的最后
- 可变个数的形参在参数列表中只能出现一次
- 方法值传递机制
- 与c类似,对于引用类型(指针类型)可以跨域修改,对于基本数据类型不会跨域修改
- 引用类型进行赋值时,是将指向存放数据的地址给另外一个变量,通过另外一个变量进行赋值操作依旧是对之前的那一块内存空间(地址值相同)中的数据进行修改
- 基本数据类型进行赋值时,是新开辟一个内存空间给新的变量,并将旧的变量中的值赋值到新的内存空间(地址值不同),当对新的变量进行修改时由于在物理内存中的地址与原始变量的地址不同故对新的变量进行修改不能改变旧的变量的值
类的成员之三:构造器
- 构造器(Constructor)是一种特殊类型的方法,用于初始化对象。构造器的名称必须与类名相同,没有返回类型,甚至没有void。在创建类的新实例时,构造器会被调用,用于初始化对象的状态。
- 默认构造器(Default Constructor):
- 如果在类中没有显式定义构造器,Java会提供一个默认构造器。默认构造器没有任何参数,并且执行的操作是基本的对象初始化。
- 重载构造器(Overloaded Constructors):
- Java允许在一个类中定义多个构造器,只要它们的参数列表不同。这种情况下,根据调用时提供的参数类型和数量,会调用匹配的构造器。
- 构造器的调用:
- 构造器通常通过关键字new来调用,在创建对象时会自动调用相应的构造器。例如:MyClass obj = new MyClass();
- 构造器的特性:
- 构造器不能被继承,因此子类无法继承父类的构造器。但是子类的构造器可以调用父类的构造器,使用super()关键字。
- 构造器重载与this关键字:
- 在类中可以定义多个构造器,通过不同的参数列表来区分它们。使用this()关键字可以在一个构造器中调用同一个类的其他构造器。
public class Car {
private String make;
private String model;
// 构造器1
public Car() {
this.make = "Unknown";
this.model = "Unknown";
}
// 构造器2
public Car(String make, String model) {
this.make = make;
this.model = model;
}
public static void main(String[] args) {
Car car1 = new Car(); // 调用构造器1
Car car2 = new Car("Toyota", "Corolla"); // 调用构造器2
}
}
包
包的声明:
- 在Java源文件的开头使用package关键字声明包名,例如:package com.example.myapp;。这个声明语句必须是文件的第一行非注释代码。
包的命名规范:
- 包名通常使用逆域名(Reverse Domain Name)的方式命名,例如com.example.myapp。这有助于避免命名冲突,特别是在大型项目中。
包的导入:
- 在Java类中,可以使用import语句导入其他包中的类,以便在当前类中使用这些类。例如:import java.util.ArrayList;
包的目录结构:
- 在文件系统中,Java包通常对应于文件夹结构。例如,包com.example.myapp可能会对应于文件夹com/example/myapp/,其中类文件位于该文件夹中。
默认包:
- 如果没有使用package语句声明包名,类将被放置在默认包中。默认包不是一个真正的包,因此最好避免在实际项目中使用默认包。
包的访问修饰符:
- Java中的包可以使用public、protected、private和默认(无修饰符)这些访问修饰符。默认情况下,包中的类对同一个包中的其他类是可见的。
包的层次结构:
- 包可以形成层次结构,例如com.example.myapp和com.example.myapp.util。这种层次结构可以帮助组织和管理大型项目中的代码。
javabean
- JavaBeans 是一种 Java 平台的组件模型,用于构建可重用的软件组件。
- 无参构造函数:JavaBeans 类必须具有一个公共的无参构造函数,以便在实例化时可以使用默认构造方法。
- 属性:JavaBeans 类通常包含私有属性,并提供公共的 getter 和 setter 方法来访问和修改这些属性。属性通常遵循命名约定,如 private String name; 对应的 getter 和 setter 方法为 getName() 和 setName(String name)。
- 序列化:JavaBeans 类可以实现 Serializable 接口,以支持对象的序列化和反序列化操作。
- 事件处理:JavaBeans 可以通过事件处理机制实现对事件的监听和处理,使其可以与其他组件进行交互。
- 标准化:JavaBeans 遵循一些标准,如命名约定、属性访问方法的命名规则等,以确保组件的一致性和易用性。
- 可视化编辑:JavaBeans 可以在集成开发环境(IDE)中进行可视化编辑,使开发人员可以通过拖放组件来快速构建用户界面。
面向对象的特性一:封装性
- 封装性指的是将数据(属性)和操作(方法)捆绑在一起,形成一个独立的单元,外部只能通过特定的接口访问对象的数据和方法,而无法直接访问对象内部的实现细节。这种机制可以隐藏对象的内部状态,只暴露必要的接口,从而提高代码的安全性和可维护性。
- 通过封装,对象可以对外部提供统一的接口,隐藏实现细节,使得对象的使用者不需要了解对象的内部实现,只需关注如何正确地使用对象提供的接口。这样可以降低代码的耦合度,提高代码的可重用性,并且可以更方便地修改和扩展对象的内部实现,而不会影响到外部代码。
java权限修饰符
-
public(公共):被声明为public的类、方法、变量可以被任何其他类访问。
-
private(私有):被声明为private的类、方法、变量只能在声明它们的类内部访问,其他任何类都无法访问。
-
protected(受保护):被声明为protected的类、方法、变量可以被同一包内的类访问,也可以被不同包中的子类访问。
-
default(默认,没有关键字修饰):如果没有指定任何访问修饰符,就是默认访问权限,即同一包内可见,不同包不可见。