300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 面向对象(类和对象 重载 构造方法 this关键字)

面向对象(类和对象 重载 构造方法 this关键字)

时间:2024-01-29 10:54:30

相关推荐

面向对象(类和对象 重载 构造方法 this关键字)

1、对象:万物皆对象

面向对象思想(Object Oriented Programming)

一切客观存在的事物都是对象,万物皆对象任何对象,一定有自己的特征和行为

对象

属性:即特征,代表对象有什么,例:电脑对象有品牌、价格、配置、尺寸等…方法:即行为,代表能做什么,例:电脑对象可以打游戏、写文档、P图等…

对象是类的一个实例,具体存在的,看得见摸得着的,并且具备该类事物的属性和行为。

2、类

2.1 类的概述

如何使用程序模拟现实世界,解决现实问题

首先,在程序中,必须具有和现实中相同的对象,用以模拟现实世界然后,使用程序中的对象代表现实中的对象,并执行操作,进而解决现实问题

现实中的对象多数来自于模板,程序中的对象也应该具有模板

例:汽车对象来自于其模板——设计图纸,宠物狗对象来自其模板——狗类这个模板称为类,先有类才能创建对象

类是用来描述一类具有共同属性和行为事物的统称。所以其实类在客观世界里是不存在的,是抽象的,只是用来描述数据信息的。

人类: 描述信息 手机类: 描述信息 学生类: 描述信息 狗类: 描述信息 …

2.2 类的组成(类=属性+行为)

属性:就是该事物的状态信息。行为:就是该事物能够做什么。

举例:手机类

属性:品牌、价格…。行为:打电话、发短信…。

2.3 类的抽取

每个对象都有特征和行为,在一组相同或相似的对象中,抽取出共性的特征和行为到类中对象 1、2、3 …具有共同特征,进行抽象形成了类,所以从对象到类称为抽象。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X5De2wo4-1622369086662)(D:\Desktop\Java\博客笔记\img\类的抽取.png)]

2.4 类的定义

**面向对象的程序设计: **新建一个类,类中有属性和方法,实例化对象,通过对象调属性和方法

类的定义步骤

①定义类

②编写类的成员变量

③编写类的成员方法

类的结构

public class 类名 {// 定义一个类// 类里面:属性(成员变量),行为(成员方法)// 定义成员变量数据类型 变量名1;数据类型 变量名2;...// 定义成员方法方法; 去掉static}

3、类和对象

3.1 面向对象和面向过程编程思想

面向过程编程思想:强调的是过程,必须清楚每一个步骤,然后按照步骤一步一步去实现

面向对象编程思想:强调的是对象,通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现

举例对比2种编程思想

洗衣服: 面向过程:把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉一揉–>清洗衣服–>拧干–>晾起来面向对象: 把衣服脱下来–>给洗衣店去洗

代码举例:打印数组所有的元素,打印格式为: [元素1,元素2,元素3,元素,…,元素n]

import java.util.Arrays;public class Test {public static void main(String[] args) {// 需求:打印数组中所有的元素,打印格式为: [元素1,元素2,元素3,元素,...,元素n]// 定义一个数组int[] arr = {10, 20, 30, 40, 50, 60};// 面向过程:强调的是过程,必须清楚每一个步骤,然后按照步骤一步一步去实现// 1.打印一个左中括号,不换行System.out.print("[");// 2.循环遍历数组元素for (int i = 0; i < arr.length; i++) {// 3.在循环中,判断遍历出来的元素:if (i == arr.length - 1) {// 4.如果遍历出来的元素是最后一个元素,打印格式为: 元素System.out.print(arr[i]);} else {// 5.如果遍历出来的元素不是最后一个元素,打印格式为: 元素,空格System.out.print(arr[i]+", ");}}// 6.循环结束后,打印右中括号System.out.println("]");System.out.println("====================================================");// 面向对象:强调的是对象,无须清楚每一个步骤,只需要找到可以完成功能的对象,让该对象去完成即可// api中jdk提供了一个Arrays类,该类的toString方法可以帮助我们按照这种格式打印数组中的元素System.out.println(Arrays.toString(arr));}}

3.2 类和对象的关系

类:对一类具有共同属性和行为的事物的统称,是抽象的|| 类是对象的模板

对象:一类事物的具体实例,看得见,摸的着的,真实存在的实体,是具体的|| 对象:根据模板创建出来的实体

类是对象的抽象,对象是类的实体

3.3 对象的创建

通过类可以创建对象,对象又被称为实例(instance),这个过程也可以称为实例化。创建对象的格式:类名 对象名 = new 类名();类其实就是对象的数据类型,类是引用数据类型例: Phone p1 = new Phone (); 创建了一个手机对象(Phone类的对象)

3.4 对象的使用

调用成员的格式:访问成员变量 获取成员变量的值: 对象名.成员变量名给成员变量赋值: 对象名.成员变量名=值; 访问成员方法 对象名.成员方法();

案例演示

public class Phone {// 属性: 品牌(brand),价格(price)// 成员变量String brand;// 品牌double price;// 价格// 行为: 打电话(call),发短信(sendMessage)// 成员方法/*明确:返回值类型: void参数: String*/public void call(String phoneNum){System.out.println("正在给"+phoneNum+"打电话...");}/*明确:返回值类型:void参数: String phoneNum,String message*/public void sendMessage(String phoneNum,String message){System.out.println("正在给"+phoneNum+"发短信,短信的内容是:"+message);}}

public class Test {public static void main(String[] args) {/*对象的创建(重点):格式: 类名 对象名 = new 类名();对象的使用:访问成员变量: 对象名.成员变量名访问成员方法(重点):无返回值的方法: 对象名.方法名(实参);------>直接调用有返回值的方法:对象名.方法名(实参); ------>直接调用数据类型 变量名 = 对象名.方法名(实参); ------>赋值调用 开发中System.out.println(对象名.方法名(实参));---->输出调用 现在成员变量有默认值:整数类型: 默认值是0小数类型: 默认值是0.0布尔类型: 默认值是false字符类型: 默认值是不可见字符引用类型: 默认值是null*/// 创建手机对象Phone p1 = new Phone();// 使用对象// 访问成员变量:System.out.println(p1.brand);// nullSystem.out.println(p1.price);// 0.0// 给成员变量赋值p1.brand = "华为";p1.price = 2999.9;// 取值System.out.println(p1.brand);// 华为System.out.println(p1.price);// 2999.9System.out.println("=========================");// 访问成员方法:p1.call("10086");p1.sendMessage("10086","请问联通的客服电话号码是多少?");}}

小结

对象的创建(重点):格式: 类名 对象名 = new 类名();对象的使用:访问成员变量: 对象名.成员变量名访问成员方法(重点):无返回值的方法: 对象名.方法名(实参);------>直接调用有返回值的方法:对象名.方法名(实参); ------>直接调用数据类型 变量名 = 对象名.方法名(实参); ------>赋值调用 开发中System.out.println(对象名.方法名(实参));---->输出调用 现在成员变量有默认值:整数类型: 默认值是0小数类型: 默认值是0.0布尔类型: 默认值是false字符类型: 默认值是不可见字符引用类型: 默认值是null

3.4 单个对象内存图

public class Student {// 成员变量: 姓名,年龄...String name;// 姓名int age;// 年龄// 成员方法: 学习,做作业...public void study(){System.out.println("学生正在学习Java...");}public void doHomeWork(){System.out.println("学生正在做作业...");}}public class Test {public static void main(String[] args) {// 创建Student对象Student stu = new Student();// 使用对象访问成员变量stu.name = "冰冰";stu.age = 18;System.out.println(stu.name);// 冰冰System.out.println(stu.age);// 18// 使用对象访问成员方法stu.study();stu.doHomeWork();}}

小结

只要创建对象,就会在堆区开辟一块空间只要调用方法,就会在栈区开辟一块空间,用来执行该方法**

3.5 多个对象内存图【理解】

public class Test {public static void main(String[] args) {// 创建Student对象Student stu1 = new Student();stu1.name = "冰冰";stu1.age = 18;System.out.println(stu1.name);// 冰冰System.out.println(stu1.age);// 18System.out.println("==========================");// 创建Student对象Student stu2 = new Student();stu2.name = "热巴";stu2.age = 17;System.out.println(stu2.name);// 热巴System.out.println(stu2.age);// 17}}

多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份凡是new就会重新在堆区开辟一块新空间对象和对象之间的关系是相互独立的

3.6. 多个变量指向相同对象内存图【理解】

public class Test {public static void main(String[] args) {// 创建Student对象Student stu1 = new Student();// 给属性赋值stu1.name = "冰冰";stu1.age = 18;System.out.println(stu1.name);// 冰冰System.out.println(stu1.age);// 18// 把stu1赋值给stu2Student stu2 = stu1;stu2.name = "热巴";System.out.println(stu1.name);// 热巴System.out.println(stu2.name);// 热巴}}

当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

3.7 成员变量和局部变量的区别【理解】

类中位置不同:

成员变量 ——成员方法外,类中局部变量——方法内部或方法声明上,在方法体,形参出现重名冲突时(同名的成员变量与局部变量有重叠作用域),局部优先(就近原则)

作用域不同

成员变量——至少在当前类中局部变量——在方法体内

内存中存储位置不同:

成员变量——堆区局部变量——栈区

生命周期不同:

成员变量(随对象的存在而存在,随对象的销毁而销毁)

局部变量(随方法的调用而存在,随方法的调用完毕而销毁)

初始化值不同:

成员变量 ——有默认初始化值,String-null,int-0,double-0.0,与数组类似,因为都是引用类型局部变量 ——没有默认初始化值,必须先定义,赋值才能使用,不赋值不能使用

4、方法重载

重载(Overload):一个类中定义多个相同名称的方法

要求:

方法名称相同参数列表不同(类型、个数、顺序,3个起码符合一个)与访问修饰符、返回值类型无关

调用带有重载的方法时,需要根据传入得到实参去找到与之匹配的方法

好处:灵活、方便、屏蔽使用差异

public void m(int a){}

public void m(int b){}

两个方法的方法名称和参数列表都相同,只有参数名称不一样,编译报错注:只是参数名称不同,并不能构成方法的重载

举例:人吃各类东西,可构成重载

实体类------Medicine类

public class Medicine {String name;}

实体类------Rice类

public class Rice {String brand;}

实体类------Person类,在类中定义重载方法

public class Person {String name;//=============方法重载=============public void eat(Rice rice) {System.out.println(name+"正在吃-"+rice.brand);}public void eat(Medicine medicine) {System.out.println(name+"正在吃-"+medicine.name);}public void eat(String a,String b) {System.out.println(name+"正在吃"+a+"和"+b);}}

public class Test {public static void main(String[] args) {Person person = new Person();//定义Person类引用类型的对象,并初始化开辟空间person.name = "张三";//为person对象的属性name赋值Rice rice = new Rice();rice.brand = "东北大米";Medicine medicine = new Medicine();medicine.name = "999感冒灵";person.eat(rice); //吃米System.out.println("=====================");person.eat(medicine); //吃药System.out.println("=====================");person.eat("薯片", "火腿"); //吃零食}}

5、构造方法

3.1 构造方法概述

构造方法是一种特殊的方法,主要是完成对象的创建和对象数据的初始化构造方法的定义格式

// 空参构造方法修饰符 类名(){}// 有参构造方法修饰符 类名(参数列表){// 方法体}

特点:

构造方法的写法上,方法名与它所在的类名相同构造方法没有返回值,所以不需要返回值类型,甚至不需要void

示例代码:

public class Student {// 成员变量: 姓名,年龄String name;// 姓名int age; // 年龄// 空参构造public Student(){System.out.println("空参构造");}// 有参构造public Student(String name,int age){this.name = name;this.age = age;}public void show(){System.out.println(name+","+age);}}public class Test {public static void main(String[] args) {/*- 构造方法的概述概述:构造是一种比较特殊的方法作用:主要用来创建对象,并给对象的属性初始化特点:1.构造方法没有返回值,连void都不能写2.构造方法的方法名必须和类名一致3.通过new来调用构造方法- 构造方法的定义:空参构造:public 类名(){}有参构造:public 类名(形参){给属性赋值}*/// 通过调用空参构造方法,创建Student对象Student stu1 = new Student();stu1.show();// null,0// 通过有参构造方法,创建Student对象Student stu2 = new Student("热巴",18);stu2.show();// 热巴,18}}

小结

构造方法的概述- 构造方法是一种特殊的方法,主要是完成对象的创建和给对象的属性进行初始化构造方法的定义- 格式:空参构造方法修饰符 类名(){}有参构造方法修饰符 类名(参数){方法体(给属性赋值)}- 特点:1.构造方法的方法名和类名一致2.构造没有返回值,连void都没有调用构造方法: 通过new来调用

3.2 构造方法的注意事项

构造方法的创建

如果没有定义构造方法,系统将给出一个默认的无参数构造方法如果定义了构造方法,系统将不再提供默认的构造方法

构造方法可以重载,既可以定义参数,也可以不定义参数。

示例代码

public class Student {private String name;// 姓名private int age;// 年龄// 构造方法// 空参构造方法public Student(){}// 满参构造方法public Student(String name,int age){this.name = name;this.age = age;}// 有参构造方法public Student(String name){this.name = name;}public Student(int age){this.age = age;}// set\get方法public void setName(String name){this.name = name;}public void setAge(int age){this.age = age;}public String getName(){return name;}public int getAge(){return age;}}public class Test {public static void main(String[] args) {/*构造方法的注意事项:1.定义构造方法,方法名一定要和类名一致2.定义构造方法,一定没有返回值类型,连void都不能写3.如果一个类没有定义构造方法,系统会默认生成一个空参构造方法4.如果一个类定义了构造方法,系统就不会默认生成一个空参构造方法5.构造方法是可以重载的6.构造方法只能给属性赋值一次,而set方法可以反复给属性赋值*/// 通过调用空参构造方法,创建Student对象Student stu = new Student();stu.setName("冰冰");stu.setAge(18);System.out.println(stu.getName()+","+stu.getAge());// 冰冰,18// 通过调用满参构造方法,创建Student对象Student stu2 = new Student("热巴",17);System.out.println(stu2.getName()+","+stu2.getAge());// 热巴,17}}

小结

构造方法的注意事项:- 构造方法的创建- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法- 如果定义了构造方法,系统将不再提供默认的构造方法- 构造方法可以重载,既可以定义参数,也可以不定义参数。- 定义构造方法的时候,不要写返回值,连void都不能有- 定义构造方法的时候,构造方法名和类名一定要一致

3.3 标准类制作

标准类的组成

JavaBean是 Java语言编写类的一种标准规范。符合JavaBean的类,要求类必须是公共的,属性使用private修饰,并且具有无参数的构造方法,提供用来操作成员变量的setget方法。

public class ClassName{//成员变量 private//构造方法//无参构造方法【必须】//满参构造方法【建议】//getXxx()//setXxx()//成员方法}

案例演示需求:定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。示例代码:

public class Student {// 成员变量--->privateprivate String name;// 姓名private int age;// 年龄// 空参构造--->快捷键: alt+insert--->Constructorpublic Student() {}// 满参构造public Student(String name, int age) {this.name = name;this.age = age;}// set\get方法--->快捷键: alt+insert--->Getter and Setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 成员方法public void show(){System.out.println("姓名是:"+name+",年龄是:"+age);}}

5、this关键字

this的含义和使用

this含义: this代表当前调用方法的引用,哪个对象调用this所在的方法,this就代表哪一个对象

this关键字其主要作用是区分同名的局部变量和成员变量

方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

this的使用格式:

this.成员变量名

使用this修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:

public class Student {private String name;private int age;public void setName(String name) {//name = name;this.name = name;}public String getName() {return name;}public void setAge(int age) {//age = age;this.age = age;}public int getAge() {return age;}}

小贴士:方法中只有一个变量名时,默认也是使用this修饰,可以省略不写。

小结

this关键字:1.作用: 用来区分同名的成员变量和局部变量2.格式: this.成员变量名3.this含义:代表当前对象当前对象: 谁调用this所在的方法,谁就是当前对象

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。