JavaSE第6篇:面向对象
文章目录
- 一、面向对象
- 二、类和对象
- 1、类和对象
- 2、类的结构:属性和方法
- 3、类和对象的创建
- 三、类的成员变量与局部变量
- 四、方法
- 1、声明和使用
- 2、方法重载和重写
- 3、可变个数形参方法
- 4、递归方法
- 五、JVM内存结构与对象内存解析
- 六、匿名对象的使用
- 七、方法参数的值传递机制
- 1、变量的赋值
- 2、值传递机制:基本数据类型
- 3、值传递机制:引用数据类型
- 总结
一、面向对象
1、面向对象:人关注对象、人关注具体事物信息
2、对象: 只要是客观存在的事物皆为对象
面向对象程序设计的重点是类的设计
设计类就是设计类的成员
思考:人把大象装进冰箱 ?
面向过程POP思想:强调的是过程(动作也就是方法)
1、把冰箱打开 2、抬起大象、塞进冰箱 3、把冰箱门关闭
面向对象OOP思想:强调的是对象(对象就是实体)
人:类 {打开(冰箱) {冰箱.打开功能}抬起(大象) {大象.进入(冰箱);}关闭(冰箱) {冰箱.闭合}}冰箱 {打开() {}闭合() {}}大象 {进入(冰箱) {比如头先进去}}
面向对象的特点:1、是一种常见思想。2、复杂变简单。3、执行者变指挥者。
二、类和对象
1、类和对象
类: 类是描述对象将会拥有的特征(属性)和行为(方法)
类的特点:类是对象的类型,具有相同属性和方法的一组对象的集合,方法和属性组成
对象:是实际存在的该类事物的每个个体、因此而成为实例(instance)
2、类的结构:属性和方法
属性Field:类的成员变量
方法Method:类中的成员方法
/*** 类的成员构成*/
public class Person {//属性或成员变量private String pName;//构造器public Person() {}public Person(String name) {this.pName = name;}//方法或者函数public void run() {System.out.println("跑步");}//代码块{pName = "周杰伦";}//内部类class Dog{String dName;}
}
3、类和对象的创建
面向对象的思想落地
1、创建类、设计类的成员
2、创建对象
类名 对象名 = new 类名();
创建类的对象就是实例化
3、使用对象
对象名.属性
对象名.方法()
理解
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性非static、如果我们修改一个对象的属性a则不影响另外一个对象的属性值。
内存解析
对象的内存解析
三、类的成员变量与局部变量
区别:
1、作用域不同
成员变量:在整个类中使用,也可以被关联的类使用
局部变量:只能在方法中使用
2、初始值不同
成员变量有一个默认的初始值
局部变量不会有初始值
3、同一个方法中局部变量不能重名,不同方法中可以有同名局部变量
4、成员变量和局部变量同名时,局部变量更有优先级
5、成员变量在堆内存中,局部变量在栈内存中
四、方法
方法描述类应该具有的功能
1、声明和使用
修饰符 返回值类型 方法名(形参列表){
方法体
return 返回值
}
return关键字:使用在方法体中
return作用:
1、结束一个方法
2、有返回值类型的方法 使用return返回 ‘数据’
3、return 后面没有语句
注意点:
方法的使用中、可以调用当前类的属性或方法
特殊:方法A中又调用了方法A。称为递归方法
2、方法重载和重写
方法重载:
同一个类中出现两个或两个以上的方法名相同,参数个数,顺序,类型不同的方法
方法重载的条件:
1、必须是在同一个类中
2、方法名相同
3、参数个数、顺序或类型不同
4、与方法的修饰符和返回值类型没有关系
两同一不同:同一个类、相同方法名。不同参数列表
方法重写
返回值类型,方法名,参数个数都要与继承父类的方法相同
子类中出现了和父类中方法声明一模一样的方法(方法名、参数列表和返回值类型都一样),也被称为方法覆盖、方法重写
3、可变个数形参方法
JDK5.0新增的内容、5.0以前传入的是数组、之后是可变形参数
使用:
可变形参的格式 数据类型…参数名
当调用可变形参的方法时,传入的参数个数可以是0个1个多个
可变形参的方法与本类中方法名相同、形参不同方法之间构成重载
可变形参的方法与本类中方法名相同、形参类型也相同的数组之间不构成重载。换句话就是二者不能共存(数组和可变形参数)
可变形参在方法中最多有一个,而且是参数的最后一个位置、声明在末尾
@Testpublic void args(){show("实参1","实参2");}public void show(String s){System.out.println("单个形参==:"+s);}public void show(String... s){for (String s1 : s) {System.out.println("可变形参==:"+s1);}}
4、递归方法
递归方法:一个方法体内调用它自身
//求1-100的和public static int getSum(int n) {if (n == 1) {return 1;} else {return n + getSum(n - 1);}}
五、JVM内存结构与对象内存解析
典型代码
Person p1 = new Person();
Person p2 = new Person();
Person p3 =p1;//没有新创建一个对象、共用一个堆空间中的对象实体
注意:p3没有创建一个新对象、共用一个堆空间中的对象实体p1
说明:如果一个类创建了多个对象,则每一个对象都独立的拥有一套类的属性(非static)。
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象的属性a的值(非static)
对象的内存解析图
数组对象的内存解析图
将Java源代码使用javac命令经过编译器生成一个或多个字节码文件,使用Java命令将字节码文件使用JVM中的类加载器和解释器对生成的字节码文件进行解释运行(注意:运行的时候才将文件加载进内存)。意味着:需要将字节码文件对应的类加载到内存中,涉及到内存解析。
六、匿名对象的使用
1、匿名对象:我们创建的对象没有显示的赋给一个变量名
2、只能调用一次 new Person().name 进行调用
/*** phone商场*/
class PhoneMall {public void showPhone(Phone phone){phone.sendEmail();phone.playGame();}
}public static void main(String[] args) {//创建一个phone商场调用phone在内存中是同一个对象PhoneMall phoneMall = new PhoneMall();phoneMall.showPhone(new Phone());//匿名对象的使用}
七、方法参数的值传递机制
1、变量的赋值
1、变量是基本数据类型、此时赋值的是变量所保存的数据值
2、变量是引用数据类型、此时赋值的是数据保存的一个地址值
注意:引用数据类型的值默认是null或者地址值
方法形参的值传递机制: 值传递
形参:方法定义时小括号内的参数
实参:方法调用时实际传递给形参的数据
2、值传递机制:基本数据类型
如果参数是基本数据类型、此时实参赋给形参的是实参真实存储的数据值
public static void main(String[] args) {//交换两个变量的值int m = 10;int n = 20;System.out.println("交换前m:" + m + ",n:" + n);
// int temp = m;
// m = n;
// n = temp;ArrayUtils arrayUtils = new ArrayUtils();arrayUtils.swap(10, 20);//实参,调用后两个变量值没有替换//swap方法确实变量进行了交换,但是方法销毁后下面输出的是定义的变量m和n确实没有交换过来System.out.println("交换后m:" + m + ",n:" + n);}/*** 交换两个变量值的方法* m,n形参*/public void swap(int m, int n) {int temp = m;m = n;n = temp;//System.out.println("swap交换后m:" + m + ",n:" + n);}
注意:swap方法确实变量进行了交换,但是方法销毁后就出栈了,下面输出的是定义的变量m和n确实没有交换过来
3、值传递机制:引用数据类型
方法参数是引用数据类型,此时实参赋给形参的是存储数据的一个地址值
class Data {int m = 10;int n = 20;/*** 交换两个变量的值** @param data*/public void swap(Data data) {int temp = data.m;data.m = data.n;data.n = temp;}
}public static void main(String[] args) {Data data = new Data();//交换两个变量的值data.m = 10;data.n = 20;System.out.println("交换前m:" + data.m + ",n:" + data.n);//交换
// int temp = data.m;
// data.m = data.n;
// data.n = temp;data.swap(data);System.out.println("交换前后:" + data.m + ",n:" + data.n);}
练习:值传递内存图
总结
JavaSE第6篇:面向对象相关推荐
- JavaSE基础知识(五)--面向对象代码实现初步(实现一个简单的类类型代码)
Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象(代码实现): 首先,在这里我需要说明一个根本性的问题:实际上,面向对象编程包括了两部分,一个是你的编程思想,一 ...
- 第四十三篇 面向对象进阶2
目录 第四十三篇 面向对象进阶2 一.类的封装 1.封装分为两个层面 2.应用 二.类的property特性 1. BMI(Body Mass Index):身体体质指数 2.装饰器用法(只在Pyth ...
- 第十篇 面向对象的程序设计
第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3 ...
- 【2023】Kotlin教程 第二篇 面向对象与函数式编程 第15章 数据容器——数组和集合 15.2 集合概述
[2023]Kotlin教程 文章目录 [2023]Kotlin教程 第二篇 面向对象与函数式编程 第15章 数据容器--数组和集合 15.2 集合概述 第二篇 面向对象与函数式编程 第15章 数据容 ...
- Java基础篇--面向对象(Object Oriented)
Java基础篇--面向对象(Object Oriented) 1. 面向对象概念 1.1 什么事面向对象 1.2 理解面向对象 1.3 面向对象的特点 1.4 面向对象开发设计特征 2. 类与对象 2 ...
- JavaSE(基础篇)——面向对象(万字总结)
每日一语:努力不是重点,常态化才是关键.真正努力的人,能随时进入任何角色,在过程中找到感觉和快乐. 前言: 引用的狂神Java基础视频--狂神Java基础视频 目录 什么是面向对象 创建与初始化对象 ...
- 【Java面试题】JavaSE基础之Java面向对象
JavaSE基础 1.Java面向对象 1.1.什么是面向对象? 1.2.对象的概念 1.3.面向对象和面向过程的关系和区别 1.4 .面向对象三大核心特性 1.4.1.继承 1.4.2.封装 1.4 ...
- 盘一盘 Python 系列特别篇 - 面向对象编程
本文含 14123 字,53 图表截屏 建议阅读 72 分钟 0 引言 在写 Keras (下) 时,发现很多内容都要用到类 (class) 和对象 (object),因此本文作为 Python 系列 ...
- 【JavaSE学习】03面向对象Java语法
JavaSE(B站黑马)学习笔记 01Java入门 02数组.方法 03面向对象&Java语法 04-1Java高级(Stream流.异常处理.日志技术) 04-2Java高级(文件处理-IO ...
最新文章
- 【发布】温度监测报警器v1.3a稳定版!
- qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...
- Java toString()方法的要点
- CENTOS6.5 TFS部署
- 20 年“码龄”的老程序员如何看编程发展?
- java 存储过程简单例子
- FFMPEG之海康实时回调出来的PS流格式
- python实现类似于visio_Visio类似的高性价比的替代软件
- 数据库sql语句关键词大全(适合老人),基本你能知道这几个关键词,基本就知道该如何写了(超简略)
- 我对Javascript闭包的理解
- 正式入职开发工程师工作近半年有感
- iOS: 设置背景颜色为渐变
- 抽象数据类型三元组Triplet基本操作与实现 严蔚敏版
- TAZ生成实践(Intel芯片Mac Python 3.7.9)
- sketch html尺寸,SketchSize一键生成多尺寸,为何你的设计效率如此之高?
- Win11的两个实用技巧系列之dns异常和打印机重命名
- Java实现肯德基点餐系统
- MySQL表记录检索
- 如何放大淘客的收入。
- 005-WebBuilder使用结构元素进行网页布局
热门文章
- Unity shader 更加真实的caustic
- 性能优化之@Contended减少伪共享
- Linux 用户与用户组关系
- COMSOLE/FreeCAD接触对使用
- java 0x0001 表示多少_java-解码十六进制:这行是做什么的(len0x01)!= 0
- Python官网的发现和收获
- Python字典底层实现原理
- python数据分析学习框架
- php client_header_buffer_size,网页出现400 Bad Request Request Header Or Cookie Too Large错误的解决方法...
- shell 中 exit0 exit1 的区别