java基础---类和对象(1)
一、 类和对象
- 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做
- 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做
- 类:是对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中体现为一种引用数据类型,里面包含了描述特征/属性的成员变量以及描述行为的成员方法,用于构建对象的模板,对象的数据结构由定义它的类来决定
- 对象:是实际存在的该类事物的每个个体, 是类的实例
- 类的定义
类主要包括成员变量和成员方法,构造器,代码块,内部类
修饰符 class 类名{ 成员变量声明; //可以在声明的同时进行初始化,否则赋予默认初始化值 {代码块} 构造器 内部类 成员方法声明; }
- 对象的创建和使用
- 使用new创建对象: 类名 对象名= new 类名();
- 使用对象名.变量或者对象名.方法的方式访问对象成员(包括变量和方法)
- 如果创建了一个类的多个对象,对于类中定义的非静态属性,每个对象都拥有各自的对象成员,互不干扰
- 类的访问机制
- 在一个类中,类中的方法可以访问该类的成员和方法
- 在不同类中,需要创建类的对象通过对象名.变量或者对象名.方法的方式访问对象成员
- 对象内存解析: 引用类型的变量只可能存储null值或者指向堆空间的地址值
- 堆(Heap) :存放new出来的对象实例,所有的对象实例和数组都在这里分配内存
- 栈(stack):通常指虚拟机栈,用于存放局部变量等,局部变量表存放了编译期间可知长度的各种基本数据类型(boolean,byte,char,short,int,long,float,double)、对象引用(reference类型,是对象在堆内存的首地址),当方法执行完后,该局部变量自动释放
- 方法区(method):用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

一个对象的创建内存解析
- 匿名对象: 没有显式的给创建的对象赋予对象名,匿名对象只能调用一次,通常将匿名对象作为实参传递给一个方法调用
二、 成员变量
- 语法格式: 修饰符 数据类型 变量名 =初始化值;
- 成员变量的默认初始化值
- 整型(byte、short、int、long):0
- 浮点型(float、double):0.0
- 字符型(char):0 (或'\u0000')
- 布尔型(boolean):false
- 引用数据类型(类、数组、接口):null
- 如果变量是基本数据类型:此时赋值的是变量所保存的数据值
- 如果变量是引用数据类型:此时赋值的是变量所保存的数据的地址值
- 变量的分类
- 在方法体外,类体内声明的变量为成员变量
- 在方法体内,方法形参等声明的变量为局部变量
- 属性(成员变量) vs 局部变量
- 相同点: 定义格式:数据类型 变量名 = 变量值;需要先声明,后使用;都有其对应的作用域
- 不同点
- 在类中声明的位置的不同:属性直接定义在类的一对{}内;局部变量声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
- 关于权限修饰符的不同: 属性:可以在声明属性时,指明其权限,使用权限修饰符;局部变量不可以有权限修饰符
- 默认初始化值的情况:属性,类的属性,根据其类型,都有默认初始化值;局部变量没有默认初始化值,在调用局部变量之前,一定要显式赋值,局部变量作为形参在调用时,我们赋值即可
- 在内存中加载的位置:属性加载到堆空间中 (非static);局部变量加载到栈空间

三、成员方法
Java里的方法不能独立存在,所有的方法必须定义在类里,通常将功能封装为方法实现代码重用
- 语法格式
修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){ 方法体程序代码 return 返回值; }
-
- 权限修饰符: private、public、缺省、protected
- 返回值类型: 有返回值 vs 没有返回值
- 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
- 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能return;表示结束此方法
- 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
- 形式参数:主要用于将方法体外的数据内容带入到方法体内部,若该方法不需要带入任何数据内容时,则形参列表位置无需填写
- return关键字用于结束方法,返回方法所需要的数据,return后面不可以声明执行语句
- 方法的使用中,可以调用当前类的属性或方法,但是不可以在方法中定义方法
- 方法的重载(Overload):方法名称相同,参数列表不同,这样的方法之间构成重载关系
- 参数的个数不同、参数的类型不同、参数顺序不同,与返回值类型和形参变量名无关,建议返回值类型最好相同
- 方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种不同的版本,来实现各种不同的功能
- 参数的个数不同、参数的类型不同、参数顺序不同,与返回值类型和形参变量名无关,建议返回值类型最好相同
public class ArrayPrintTest { public static void main(String[] args) { int[] arr = new int[]{1,2,3}; System.out.println(arr);//地址值 //这里是因为println方法调用的是println(char [] arr) //将字符数组遍历 char[] arr1 = new char[]{'a','b','c'}; System.out.println(arr1); //abc } }
四、可变长形参
- 语法格式:返回值类型 方法名(参数的类型... 参数名)
- 注意事项:
- 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,...
- 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载,可变个数形参在方法的形参中,必须声明在末尾可变个数形参在方法的形参中,最多只能声明一个可变形参
public class MethodArgsTest { public static void main(String[] args) { MethodArgsTest test = new MethodArgsTest(); test.show("hello"); test.show("hello","world"); test.show(); // test.show(new String[]{"AA","BB","CC"}); } public void show(String s){ System.out.println("show(String)"); } public void show(String ... strs){ System.out.println("show(String ... strs)"); for(int i = 0;i < strs.length;i++){ System.out.println(strs[i]); } } //不能与上一个方法同时存在 // public void show(String[] strs){ // // } }
五、方法参数的值传递机制
Java里方法的参数传递方式只有一种: 值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
-
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
- 基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间
- 引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间
- 当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同的内存空间
六、 构造器
- 语法格式: 权限修饰符 类名(形参列表){}
-
构造器的特征
- 它具有与类相同的名称
- 不声明返回值类型。(与声明为void不同)
- 不能被static、 final、 synchronized、 abstract、 native修饰,不能有return语句返回值
- 注意
- Java语言中,每个类都至少有一个构造器
- 默认构造器的修饰符与所属类的修饰符一致
- 一旦显式定义了构造器, 则系统不再提供默认构造器
- 一个类可以创建多个重载的构造器
- 父类的构造器不可被子类继承
- 构造器一般用来创建对象的同时初始化对象 ,构造器重载,参数列表必须不同
七、this关键字
- 当在方法内需要用到调用该方法的对象时,就用this来区分属性和局部变量
- this可以用来修饰、调用:属性、方法、构造器,属于类层级,指代当前对象 或 当前正在创建的对象
- 如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。
- this调用构造器
- 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
- 构造器中不能通过"this(形参列表)"方式调用自己
- 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
- "this(形参列表)"必须声明在当前构造器的首行,构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器
- this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值
八、封装
封装:对成员变量进行密封包装处理,来隐藏成员变量的细节以及保证成员变量数值的合理性
- 封装的实现流程
-
- 私有化成员变量,使用private关键字修饰。
- 提供公有的get和set方法,并在方法体中进行合理值的判断。
- 在构造方法中调用set方法进行合理值的判断
- JavaBean:一种Java语言写成的可重用组件,是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、 set方法
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、 Servlet、其他JavaBean、 applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用心任何改变。
public class JavaBean { private String name; // 属性一般定义为private private int age; public JavaBean() { } public int getAge() { return age; } public void setAge(int a) { age = a; } public String getName() { return name; } public void setName(String n) { name = n; } }
九、package 关键
-
package:package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。 (若缺省该语句,则指定为无名包)
-
语法格式:package 顶层包名.子包名 ;
-
包对应于文件系统的目录, package语句中,用 “.” 来指明包(目录)的层次;
-
包通常用小写单词标识。通常使用所在公司域名的倒置: com.atguigu.xxx
- 包的作用:
- 包帮助管理大型软件系统: 将功能相近的类划分到同一个包中。 比如: MVC的设计模式
- 包可以包含类和子包, 划分项目层次, 便于管理
- 解决类命名冲突的问题
- 控制访问权限
- 同一个包下,不能命名同名的接口、类;不同的包下,可以命名同名的接口、类。
- JDK中主要的包介绍
- java.lang----包含一些Java语言的核心类, 如String、 Math、 Integer、 System和Thread, 提供常用功能,可以不用导入
- java.net----包含执行与网络相关的操作的类和接口。
- java.io ----包含能提供多种输入/输出功能的类。
- java.util----包含一些实用工具类, 如定义系统特性、 接口的集合框架类、 使用与日期日历相关的函数。
- java.text----包含了一些java格式化相关的类
- java.sql----包含了java进行JDBC数据库编程的相关类/接口
- java.awt----包含了构成抽象窗口工具集(abstract window toolkits) 的多个类, 这些类被用来构建和管理应用程序的图形用户界面(GUI)
- MVC设计模式
MVC是常用的设计模式之一,将整个程序分为三个层次: 视图模型层,控制器层,与数据模型层。 这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变的灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合


十、import关键字
- 在源文件中显式的使用import结构导入指定包下的类、接口
- 声明在包的声明和类的声明之间
- 如果需要导入多个结构,则并列写出即可
- 可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构
- 如果使用的类或接口是java.lang包下定义的,则可以省略import结构
- 如果使用的类或接口是本包下定义的,则可以省略import结构
- 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。
- 使用"xxx.*"方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入
- import static:导入指定类或接口中的静态结构:属性或方法。
浙公网安备 33010602011771号