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关键字相关推荐

  1. JAVA类和对象(构造方法、方法重载、this关键字)

    Java是一门完全面向对象的编程语言:类和对象是面向对象编程的基础和核心. 面向对象的编程思想是来源于现实生活:面向对象编程是使用代码来模拟现实生活中的场景. 1.现实生活中有哪些是对象? 对象:在现 ...

  2. 高阶Day1:面向对象,面向过程,类和对象的属性和方法创建

    高阶Day1:面向对象,面向过程,类和对象的属性和方法创建 高级编程学习4个内容: 面向对象 MySQL数据库 网络编程 并发编程 面向过程(POP)与面向对象(OOP): 类和对象: 类名的定义: ...

  3. 19. Python 类的重写   类的私有变量和私有方法

    1.类的重写 例子: class parent(object):name = 'parent'age = 100def __init__(self):print('my name is parent' ...

  4. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  5. android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...

    一.类和构造方法 (类和对象在百度百科已经有详细的介绍,这里只做简单的描述以及帮助理解:百度百科:类和对象,需要注意的是,百度百科类和对象的举例中都是C++,书写格式不要和Java混淆!) 什么是类? ...

  6. JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)

    第1节 面向对象基础 一.面向对象思想 1.1 概述 面向对象(Object Oriented)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算 ...

  7. 学习-Java类和对象之构造方法与对象创建之求椭圆面积

    任务描述 本关任务:已知椭圆的短半轴长为 15.50,长半轴的长为 20.00,计算椭圆面积. 椭圆的面积公式为S=πab,其中a.b分别为椭圆的短半轴长和长半轴长. 相关知识 为了完成本关任务,你需 ...

  8. JAVA类与对象构造方法,java基础-1-面向对象(1)-概念介绍与类、对象、构造方法...

    -------android培训.java培训.期待与您交流! ---------- 什么叫做面向对象? 想要了解什么事面向对象,我们首先需要了解,什么是面向过程. 所谓的面向过程,指的是在编程期间, ...

  9. Java面向对象 类、对象、构造方法、封装

    第1章 面向对象基础 1.1 编程思想概述 1.1.1 面向过程思想概述 我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现.一步一步去实现,而 ...

  10. 06.面向对象、类、对象、构造方法及封装

    Java面向对象 第1章 第1章 面向对象基础 1.1 编程思想概述 1.1.1 面向过程思想概述 我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代 ...

最新文章

  1. python中的类与对象
  2. jwt https://mp.weixin.qq.com/s/8FdzMq4msyhqE9Rrhgwqjw
  3. Maven +Tomcat+m2eclipse的热部署(hot deploy)
  4. 【Elasticsearch】Elasticsearch之集群角色类型
  5. python操控chrome抓网页
  6. 柯洁:我受够了AI围棋;联发科校园招聘,应届生年薪约45万元;Chrome 100发布 | 极客头条...
  7. html让时间只展示年月日_JS 如何动态显示当前年月日时分秒-百度经验
  8. Hibernate配置文件
  9. gnome 3.4 评测
  10. 曲线运动与万有引力公式_【知识总结】物理必修二曲线运动与万有引力相关公式和规律...
  11. 【PMP】七、项目成本管理
  12. 服务器分区系统安装win7系统教程,详细教您gpt分区安装win7步骤
  13. jieba库:Tokenizer()类详解:(五)tokenize分词
  14. HDLC——高级数据链路控制(HDLC,High-level Data Link Control)
  15. 猿如意工具-【SwitchHosts】详情介绍
  16. Sqli-labs之Less-17
  17. 【C++Primer笔记】第四章 表达式
  18. 关于欧几里得距离的一些解释
  19. 这些东西别晒到朋 友 圈,小心惹来祸!
  20. Excel将日期和数字一键转为文本格式的操作

热门文章

  1. Junos设备密码恢复
  2. H5实时上传位置定位 pc生成轨迹;h5保持后台运行
  3. TSOJ 好好做题(屑)——递推状态压缩+高精度
  4. 人工智能一词,正在被“夸克们”玩坏
  5. 一维测量助手(尺寸检测、精确定位)
  6. 如果不是对的人,最终的结局大概不会好吧
  7. Python-jQuery
  8. PostgreSQL中uuid的使用,uuid_generate_v4()
  9. 行业报告免费下载-干货!68份营销行业报告分享
  10. 炫酷!从未见过如此Q弹的Switcher