【JavaLearn】 # (2)类和对象、变量、构造方法、普通方法、this关键字
1. 类和对象
1.1 面向过程和面向对象
面向过程和面向对象都是对软件分析、设计和开发的一种思想。
- 机器语言
- 汇编语言
- 高级语言
- 面向过程:C、Fortran。。。
- 面向对象:C++、Java、C#
先有面向过程的思想,随着软件规模扩大,问题复杂性的提高,出现了面向对象的思想。软件的分析、设计、开发就演化成了面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)
示例1:开车和造车
① 面向过程思想:首先要思考”怎么按步骤实现?“,将步骤对应方法,一步一步,最终实现(重点关注如何执行)
点火,发动 ==》 挂挡 ==》 踩油门 ==》 gogogo
② 面向对象的思想:如果要造一辆车呢?面向过程的思想显然就不适合了,我们需要使用面向对象的思想进行思考,首先要思考的是”怎么设计这个事物?“,例如,”车怎么设计?“
要设计车,我们得先从”车由什么组成“开始思考,车主要由以下对象组成:
车: 轮胎、发动机、车壳、座椅、玻璃。具体到轮胎的生产,又是流水线似的,面向过程的思想
示例2:蛋炒饭和盖浇饭
面向过程的思想:蛋炒饭,鸡蛋和米饭混合在一起,高度耦合,如果想换成鸭蛋炒米饭,将会非常麻烦
面向对象的思想:盖浇饭,米饭和菜分离,可以西红柿盖饭,不满意可以将西红柿换成红烧肉,低耦合
总结:
- 面向过程是一种“执行者思维”,可以解决简单的问题
- 面向对象是一种“设计者思维”,解决复杂、需要协作的问题
- 面向对象离不开面向过程:从宏观上使用面向对象进行整体设计,在微观上,面向过程执行和处理数据。
1.2 理解类和对象
总结一类事物具有什么样的特征的过程,就是抽象的过程
类:模板,包含了同一类事物共有的属性、方法 == 》 汽车的图纸
对象(实例):由模板制造的具体事物 ==》 汽车
示例1:英雄联盟中的类和对象
英雄就是一个类,具体的英雄,盖伦、提莫就是对象。
细致解析:
类的基本组成:成员变量(属性field)和成员方法(method)
成员变量:[修饰符] 数据类型 属性名 = [默认值];
变量都具备默认值(整型:0, 浮点型:0.0, 字符型:‘\u0000’,引用类型:null,布尔型:false)
成员方法: [修饰符] 方法返回值类型 方法名 ( 形参列表 ) { // TODO }
方法具有封装、重用代码
对象的操作:创建对象、操作属性、调用方法
创建对象:类名 引用名 = new 类名(); // 构造方法
操作属性:
p1.name = “张三”; // 赋值
String name = p1.name; // 取值
调用方法:对象名.方法名(实参列表) p1.work(“学校”);
具体的代码示例:模拟人的行为,吃饭工作和休息
面向对象分析 OOA
从张三、李四、王五中提取出共同内容,抽象成一个“人” 类 Person,包含静态的属性和动态的行为
- 静态的属性:姓名、年龄、性别、住址
- 动态的行为:eat、rest、work
面向对象设计 OOD
- 类:Person
- 对象:zhangsan、lisi 然后让对象完成功能(吃饭、工作、休息)
面向对象编程 OOP
public class Person {// 静态特征 -- 成员变量 fieldString name;int age;// 动态行为 -- 成员方法 methodpublic void eat() {System.out.println("啊呜啊呜");}public void work(String str) {System.out.println(name + "在" + str + "工作");} }// 测试类 class TestPerson {public static void main(String[] args) {// 创建一个对象Person zhangsan = new Person();// 操作属性zhangsan.name = "张三";zhangsan.age = 25;zhangsan.eat();zhangsan.work("办公室");// 创建另一个对象Person lisi = new Person();lisi.age = 18;lisi.eat();} }
对象内存分配图:
- 每个线程(调用 main() 就开辟一个新的线程)会有单独的一个栈,每次调用方法,就会开辟一个栈帧。方法执行完后,栈帧弹出。先进后出。和垃圾回收没有关系
- 堆内存是共享的空间,不管多少线程,都共享同一块堆内存。真正对象的内容是存在堆内存中的。如果对象失去了指向,对象就变成了垃圾。等待垃圾回收器来回收。
2. 局部变量和成员变量
public class Calculator {// 成员变量 静态特征String brand; // 品牌double size; // 尺寸// 成员方法 动态行为public int add(int num1, int num2) { // num1, num2, res 局部变量int res;res = num1 + num2;return res;}public static void main(String[] args) {// 使用类创建一个计算器对象Calculator calc = new Calculator(); // calc 成员变量int res = calc.add(10, 20); // res 局部变量System.out.println(res);}
}
代码分析:
- 栈内存:存放各个方法的局部变量
- 基本类型:num1, num2, res
- 引用类型:calc
- 堆内存:存放对象的具体数据,成员变量
局部变量和成员变量的区别:
成员变量:在类中定义的变量
局部变量:在方法中定义的变量,包括方法的参数,代码块中定义的变量
成员变量 | 局部变量 | |
---|---|---|
代码中位置不同 | 类中定义的变量 | 方法或代码块中定义的变量 |
内存中位置不同 | 堆内存 | 栈内存 |
是否有默认值 | 有 | 没有 |
代码作用范围(空间) | 当前类的方法 | 当前的一个方法或代码块 |
作用时间不同 | 当前对象从创建到销毁 | 定义变量到所属方法或代码块执行完毕 |
3. 构造方法及其重载
什么叫重载?
在同一个类中,相同:方法名,不同:参数的类型或者个数,方法的返回类型、修饰符可以相同也可不同
3.1 构造方法
对于一个类,一般有 3 种常见的成员:属性 field、方法 method、构造器 constructor,这 3 个成员都可以定义 0 个或多个。
构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类名一致。Java通过 new 关键字来调用构造器,从而返回该类的实例。
[修饰符] 类名(形参列表) { //TODO; }
public class Computer {// 成员变量private String cpu;private String mainBoard;// 默认构造方法,不声明的话方法体就是空的public Computer() {System.out.println("默认的构造方法,使用new Computer()就会调用");}// 构造函数的重载// 如果提供了有参数的构造方法,无参数的构造方法将不再默认提供。需要显式写出public Computer(String cpu, String mainBoard) {// 局部变量和成员变量同名时,局部变量优先级别高,需要使用 this 来区别成员变量this.cpu = cpu;this.mainBoard = mainBoard;}// 成员方法public void start() {System.out.println("----------starting------------");}public static void main(String[] args) {// 调用默认构造方法Computer c = new Computer();// 调用成员方法c.start();// 操作成员变量c.cpu = "intel";// 调用带参的构造方法Computer computer = new Computer("M1", "金士顿");System.out.println(computer.cpu);}
}
构造器4个要点:
- 和类同名,没有返回值类型,作用:完成创建对象的初始化操作
- 构造器通过 new 关键字调用
- 构造器不能定义 返回值类型
- 每个类都默认提供一个无参的构造方法,如果显式的进行了定义,则编译器不会再创建默认的。
对象的创建完全是由构造方法实现的吗?
不完全是。创建一个对象共分4步:
分配对象空间,并将对象成员变量初始化为 0 或 null
执行属性值的显式初始化
=== 前两步,由虚拟机完成 ===
执行构造方法
返回对象的地址给相关的变量
3.2 对象数组
Computer[] arr = new Computer[2];
arr[0] = new Computer("intel", "金士顿");
arr[1] = new Computer("AMD", "三星");
4. 方法调用
方法调用时,参数的传递分为两种:基本数据类型的调用,引用数据类型的调用
4.1 基本数据类型的方法调用 – 值调用
public static void main(String[] args) {// 定义两个变量并赋值int num1 = 10;int num2 = 20;// 输出交换之前变量的值System.out.println("交换前:num1=" + num1 + ",num2=" + num2);// 进行交换swap(num1, num2); // 将值拷贝一份,只是交换了拷贝的内容。// 输出交换之后的值System.out.println("交换后:num1=" + num1 + ",num2=" + num2);
}public static void swap(int num1, int num2) {int tmp = num1;num1 = num2;num2 = tmp;
}
4.2 引用数据类型的方法调用 – 地址传递
地址传递本质上也是值传递
class Point {int x;int y;// 默认构造方法public Point() {}// 重载构造方法public Point(int x, int y) {this.x = x;this.y = y;}
}/* ----------------------- 测试类 -----------------------*/
public class TestRefArgs {public static void main(String[] args) {// 定义两个变量并赋值Point p = new Point(10, 20);// 输出交换之前变量的值System.out.println("交换前:p.x = " + p.x + ", p.y = " + p.y);// 进行交换swap(p); // 此处为地址传递// 输出交换之后的值System.out.println("交换后:p.x = " + p.x + ", p.y = " + p.y);}public static void swap(Point p) {int tmp = p.x;p.x = p.y;p.y = tmp;}
}
5. this关键字
this 的作用
- 每创建一个对象,都会有一个 this 的引用变量,
指向当前对象
(创建了 10 个对象,就会有 10 个 this)。- 在类的内部可以使用 this 来访问类的成员
this 的使用 —— this 用来访问类的成员
- this.name = name; 调用成员变量 ==》 如果局部变量和成员变量同名,需要使用 this 来区分
- this(sno, name); 调用构造方法 ==》 在构造方法中必须是第一条语句
- this.show(); 调用成员方法 ==》 this 可以省略
this 关键字不能用于 static 方法中
public class Student {int sno;String name;int age;// 默认构造方法public Student() {}// 重载构造方法public Student(int sno, String name) {this.sno = sno; // 1. 调用成员变量this.name = name;}public Student(int sno, String name, int age) {this(sno, name); // 2. 调用构造方法}public void show() {System.out.println("My name is " + name);}public void study() {this.show(); // 3. 调用成员方法System.out.println("good good study!");}public static void main(String[] args) {Student stu = new Student();stu.sno = 1;stu.name = "张三";stu.study();Student stu1 = new Student(2, "李四");stu1.show();}
}
【JavaLearn】 # (2)类和对象、变量、构造方法、普通方法、this关键字相关推荐
- JAVA类和对象(构造方法、方法重载、this关键字)
Java是一门完全面向对象的编程语言:类和对象是面向对象编程的基础和核心. 面向对象的编程思想是来源于现实生活:面向对象编程是使用代码来模拟现实生活中的场景. 1.现实生活中有哪些是对象? 对象:在现 ...
- 高阶Day1:面向对象,面向过程,类和对象的属性和方法创建
高阶Day1:面向对象,面向过程,类和对象的属性和方法创建 高级编程学习4个内容: 面向对象 MySQL数据库 网络编程 并发编程 面向过程(POP)与面向对象(OOP): 类和对象: 类名的定义: ...
- 19. Python 类的重写 类的私有变量和私有方法
1.类的重写 例子: class parent(object):name = 'parent'age = 100def __init__(self):print('my name is parent' ...
- python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...
一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...
- android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...
一.类和构造方法 (类和对象在百度百科已经有详细的介绍,这里只做简单的描述以及帮助理解:百度百科:类和对象,需要注意的是,百度百科类和对象的举例中都是C++,书写格式不要和Java混淆!) 什么是类? ...
- JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)
第1节 面向对象基础 一.面向对象思想 1.1 概述 面向对象(Object Oriented)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算 ...
- 学习-Java类和对象之构造方法与对象创建之求椭圆面积
任务描述 本关任务:已知椭圆的短半轴长为 15.50,长半轴的长为 20.00,计算椭圆面积. 椭圆的面积公式为S=πab,其中a.b分别为椭圆的短半轴长和长半轴长. 相关知识 为了完成本关任务,你需 ...
- JAVA类与对象构造方法,java基础-1-面向对象(1)-概念介绍与类、对象、构造方法...
-------android培训.java培训.期待与您交流! ---------- 什么叫做面向对象? 想要了解什么事面向对象,我们首先需要了解,什么是面向过程. 所谓的面向过程,指的是在编程期间, ...
- Java面向对象 类、对象、构造方法、封装
第1章 面向对象基础 1.1 编程思想概述 1.1.1 面向过程思想概述 我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现.一步一步去实现,而 ...
- 06.面向对象、类、对象、构造方法及封装
Java面向对象 第1章 第1章 面向对象基础 1.1 编程思想概述 1.1.1 面向过程思想概述 我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代 ...
最新文章
- python中的类与对象
- jwt https://mp.weixin.qq.com/s/8FdzMq4msyhqE9Rrhgwqjw
- Maven +Tomcat+m2eclipse的热部署(hot deploy)
- 【Elasticsearch】Elasticsearch之集群角色类型
- python操控chrome抓网页
- 柯洁:我受够了AI围棋;联发科校园招聘,应届生年薪约45万元;Chrome 100发布 | 极客头条...
- html让时间只展示年月日_JS 如何动态显示当前年月日时分秒-百度经验
- Hibernate配置文件
- gnome 3.4 评测
- 曲线运动与万有引力公式_【知识总结】物理必修二曲线运动与万有引力相关公式和规律...
- 【PMP】七、项目成本管理
- 服务器分区系统安装win7系统教程,详细教您gpt分区安装win7步骤
- jieba库:Tokenizer()类详解:(五)tokenize分词
- HDLC——高级数据链路控制(HDLC,High-level Data Link Control)
- 猿如意工具-【SwitchHosts】详情介绍
- Sqli-labs之Less-17
- 【C++Primer笔记】第四章 表达式
- 关于欧几里得距离的一些解释
- 这些东西别晒到朋 友 圈,小心惹来祸!
- Excel将日期和数字一键转为文本格式的操作