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:导入指定类或接口中的静态结构:属性或方法。
java基础---类和对象(1)的更多相关文章
- 第31节:Java基础-类与对象
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...
- JAVA基础——类和对象
java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...
- Java基础-类和对象
类和对象 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. ...
- Java基础—类和对象
基本概念 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提 ...
- java基础---类和对象(4)
一. static关键字 使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层级提升为类层级,整个类共享一份静态成员变量,该成员变量随着类的加载准备就绪,与是否创建对象无关 使用st ...
- Java基础——类和对象的初始化过程
本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: public class Demo { private static String name; private String age; ...
- java基础---类和对象(3)
一.Object类 java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类 如果定义一个Java类时没有使用extends关键字声明其父类,则 ...
- java基础---类和对象(2)
一.继承(extends) 面向对象的三大特性之一,当多个类中存在相同属性和行为时,将这些内容抽取到一个公共类中,让多个类(子类)吸收公共类(父类.超类)中已有特征和行为,而在多个类型只需要编写自己独 ...
- Java基础-IO流对象之字符类(FileWrite与FileReader)
Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...
随机推荐
- 策略模式干掉if-else,switch
1.传统if -else 写法 String nodeModelStr = ""; if (nodeType == NodeType.START){ StartModel star ...
- MegEngine计算图、MatMul优化解析
MegEngine计算图.MatMul优化解析 本文针对天元在推理优化过程中所涉及的计算图优化与 MatMul 优化进行深度解读,希望能够帮助广大开发者在利用天元 MegEngine「深度学习,简单开 ...
- 网络模型mAP计算实现代码
网络模型mAP计算实现代码 一.mAP精度计算 这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negtive)分别是: 1)True posi ...
- TensorFlow Keras API用法
TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...
- Spring Cloud04: RestTemplate的使用
上一篇我们已经学会了如何创建一个服务提供者,那么这一篇我们来创建一个服务消费者,实现思路是先通过Spring boot搭建一个微服务应用,再通过Eureka Client把它注册到注册中心Eureka ...
- 前端 JS 之 AJAX 简介及使用
概述 AJAX 是一个缩写,它的全名是 Asynchronous JavaScript and XML,意思就是异步 JavaScript 和 XML,即用JavaScript执行异步网络请求. AJ ...
- 【VBA】返回指定范围内的随机整数
返回指定范围内的随机整数: Sub main() Randomize Debug.Print 随机整数(1, 2) End Sub Function 随机整数(a As Integer, b As I ...
- 【C++】解决c++中cout输出中文乱码问题
问题:cout输出中文乱码.例如下面的代码输出会乱码. cout << "成功!" << endl; 输出结果: 解决方案: 控制台还原旧版即可,打开程序- ...
- python学习笔记01-简单接触
前言:陆陆续续学习python一年多了,每次都因为各种原因中断了,希望这次可以通过记录更新的方式坚持学完一轮. 简单了解python Python是一种解释型.面向对象.动态数据类型的高级程序设计语言 ...
- Redis面试连环问,快看看你能走到哪一步
今天,我不自量力的面试了某大厂的java开发岗位,迎面走来一位风尘仆仆的中年男子,手里拿着屏幕还亮着的mac,他冲着我礼貌的笑了笑,然后说了句"不好意思,让你久等了",然后示意我坐 ...