本章总结
面向对象编程步骤
1). 根据题目要求定义类
2). 根据题目要求定义类中的成员属性, 构造方法,成员方法
3).创建测试类,在测试类的main方法中,使用类创建对象
4).通过对象设置对象属性,通过对象调用对象方法完成特定功能
一、 对象的概念
我们可以这么说:万事万物皆对象。
对象
:我们所面对的可以描述其具体形象的事物称为对象。对象可以简单理解为看得见摸得着的事物。
我们一般从两个方面来描述一个对象:属性(特征),方法(行为)。
属性
:用于描述对象具有的特征
方法
:用于描述对象具有的行为或功能
例如:描述一个电视机对象
属性: 用于描述对象具有的特征
电视机: 属性(颜色,品牌,价格) 属性值(黑色,小米,2000)
颜色: 黑色
品牌: 小米
价格: 2000
方法: 用于描述对象具有的功能
电视机:方法/功能(播放电视剧,看电影)
播放电视剧()
开机()
关机()
描述我用的笔记本电脑对象:
同样的笔记本对象具有相同的属性和方法,但是属性值是不一样的,可以区分不同的对象。
笔记本的属性:
牌子: thinkpad 480 / 小米
颜色: 黑色 / 白色
重量: 2kg / 1.5kg
cpu: i5 / i7
内存: 16G / 16G
硬盘: 128固态+512机械 /512固态
笔记本的方法:
开机()
关机()
写代码()
授课()
描述你的好朋友: 张三,李四,宿舍房间,床,水杯
1.1 什么是面向对象编程
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象
1.2 面向过程和面向对象编程
但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,增强可维护性,所以,面向对象的开发更像是一个具备标准的开发模式。
举例:
面向过程:针对开发中程序遇到的每一个问题,进行单个的编码解决。
自己做饭,买菜,洗菜,炒菜,自己吃
面向对象:只对结果,不管实现的细节。
到饭馆叫饭,自己吃
学习面向对象其实就是学习如何在代码中使用 封装,继承,多态。
在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏; 安全性
(2)继承:在原本的基础之上继续进行扩充; 复用性
(3)多态:在一个指定的范围之内进行概念的转换。可扩展性
对于面向对象的开发来讲也分为三个过程:
OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。
总结:面向对象最终的目的是在保证功能实现的基础上,方便后期程序的维护。
二、 类的概念
2.1 什么是类
具有相同属性和行为的对象,可以被归为一类。
令狐冲:
属性:姓名(令狐冲),性别(男),年龄(28),
方法:会武功(耍剑)
东方不败:
属性:姓名(东方不败),性别(女),年龄(18)
方法:会武功(绣花)
令狐冲和东方不败都具有相同的属性和方法,因此他们可以归为【人类】。
由此:
宝马,奔驰,法拉利也具有相同的属性和行为所以可以归为【车类】。
类
:将具有相同属性和方法的对象进行抽象,这就是类。
它一般包括了属性和方法两大部分。可以理解为类是对象的设计图纸(房屋设计图,手机设计图)。
类限定了对象具有的特征属性和行为,因此可以将类看作对象的模板。通过一个类,我们可以创建任意个对象,而被创建的同一个类任意个对象,都具有相同的属性和行为。
类是对象的模板。对象是类的实例。
类是抽象的概念,对象是具体的存在。
注意:同一个类的对象,会具有相同的属性和方法,但是它们的属性值可以不一样,这样可以区分出不同的对象实体。
面向对象编程,为什么要从定义类开始?因为在创建对象(车/房子)之前,需要先设计对象具有的属性和行为,所以要先把对象所属的类(汽车图纸/房屋图纸)定义出来。通过定义好的类,来创建这个类型的对象(先有月饼模子,再创建月饼出来)。
面向对象编程的步骤:
1.定义类型
2.用类型创建具体的对象
3.调用对象的属性和方法,完成程序处理
2.2 类的结构
public class 类名{
//成员属性
//构造方法
//成员方法
}
实例
public class Student {
// 属性: 成员属性,成员变量,全局变量
// 姓名
String name;
// 性别
String sex;
// 年龄
int age;
// 身高
double tall;
// 方法: 成员方法,实例方法
public void eat(){
// this:当前对象
System.out.println(this.name+"吃早餐");
}
public void study(){
System.out.println(this.name+"学习java");
}
}
2.3 类的使用
使用类创建对象,为对象赋值,并调用对象方法
public class Test {
public static void main(String[] args) {
// 使用类创建对象
Student s1 = new Student();
// 设置对象属性
s1.name="张三";
s1.sex="男";
s1.age = 18;
s1.tall = 1.7;
// 调用对象方法
s1.eat();
s1.study();
Student s2 = new Student();
s2.name="李四";
s2.sex="女";
s2.age = 16;
s2.tall = 1.8;
s2.eat();
s2.study();
}
}
注意:类的属性本质是全局变量,是有默认值的
字符串: null 整形: 0 小数: 0.0 布尔: false
而方法内的变量是局部变量,不赋值的时候无法使用
面向对象编程的步骤:
1.根据题目定义类: 定义属性和方法
2.使用类
a.创建测试类,定义main方法
b.在main方法中,使用类创建对象: 类名 变量 = new 类名();
c. 使用创建出来的对象,设置对象属性,访问对象属性,调用对象方法
完成特定功能。
三、构造方法
构造方法:在类创建对象的时候,通过new关键字调用的方法称为构造方法。它可以用于为对象属性设置初始值。
语法:
public class 类名{
//构造方法
public 类名(参数列表){
// 初始换属性
}
}
//通过new调用构造方法,创建类的对象类名
变量 = new 类名();
特征:
- 构造方法是非常特殊的方法,方法名要与类名完全一样
- 构造方法不能写返回值
- 构造方法通过new关键字调用
- 一个类中,可以定义构造,也可以不定义构造。当类中没有定义构造的时候,系统会提供默认无参构造,当类中定义了构造之后,系统将不再提供默认无参构造
- 一个类中可以定义多个构造
作用:
- 使用类创建对象的时候要调用构造方法
- 通过构造可以为对象的属性设置初始值,避免漏掉某些属性不赋值
实例:
public class Student{
String name;
int age;
String sex;
double height;
public Student() {}
public Student(String name,String sex,int age,double height) {
this.name=name;
this.age=age;
this.sex=sex;
this.height=height;
}
public Student(String name,String sex,int age) {
this.name=name;
this.age=age;
this.sex=sex;
}
}
通过构造方法创建类的对象:
Student stu=new Student("孙悟空","男",19,1.65);
构造方法小结:
- 定义构造方法:public + 类名(参数列表){初始化代码}
- 当类没有构造方法时,系统会给一个默认的空构造方法
- 当你一旦定义了自己的构造方法,系统就收回了默认的构造方法
- 如果还想用默认的构造方法,则必须自己另外定义
- 自定义的构造方法主要用于对象的初始化
四、成员方法
构造方法的作用,是为了创建对象。
成员方法是为了实现某个具体的功能: 吃早餐,打游戏,听音乐,学习
语法:
[访问修饰符] 返回值类型 方法名([参数列表]){
方法体
return 返回值;
}
说明:
[访问修饰符] : 中括号在语法描述上表示这个部分可以省略
- 访问修饰符,表示定义的方法能够被访问的一个范围 。
- 属性/方法的访问修饰符: 总共有四个级别 public,protected,默认,private
- 返回值类型: 必须要有。取值:
void: 表示这个方法不需要返回结果
其他任何类型(基本类型/引用类型) : 表示方法必须要有返回值,而且返回值的类型要和定义的类型一致。
- 方法名: 自己定义,按照标识符的规则(字母,数字下划线),要按照小驼峰命名
- 参数列表:可以省略,省略的时候表示这个方法不需要参数。如果有参数,那么在调用方法是必须要按照参数列表的定义传递参数。可以是各种类型的数据
- 方法体: 方法实现具体功能的代码部分。
- 返回值: 要和方法的返回值类型结合使用。
如果返回值类型是void。那么该方法不能有返回值(要么没有reutrn,要么return后面不要写数据)。如果返回值类型不是void,是其他类型: 那么此时方法最终一定要有返回值,而且返回的数据要和返回值类型对应
//无返回值的方法
public void eat(String food) {
System.out.println(name+"在吃"+food);
}
//带返回值的方法
public String buy(double money) {
if(money<=1.5) {
return "矿泉水";
//返回的具体值必须是定义的类型的值
}else {
return "方便面";
}
}
// 带返回值的方法的调用
String res=stu.buy(5.5);
System.out.println(res);
定义手机类
public class Phone {
// 品牌
String brand;
// 价格
double price;
// 有参构造
public Phone(String brand,double price){
this.brand=brand;
this.price=price;
}
// 成员方法
// 显示手机信息
public void showInfo(){
System.out.println(this.brand+" "+this.price);
}
// 充电
public void chongdian(int hours){
System.out.println("给手机充电:"+hours+"小时");
if(hours<=1){
System.out.println("没充满");
}else{
System.out.println("充满了");
}
}
/**
* 有参有返回值的方法
* 给某人打电话
* @param name : 给谁打电话
* @param min : 打了多少分钟
* @param money: 每分钟多少钱
* @return : 返回一共花了多少钱
*/
public double call(String name,int min,double money){
System.out.println("使用价值"+this.price+"的"+this.brand+"手机,给"+name+"打了"+min+"分钟电话");
double qian = min*money;
return qian;
}
}
通过测试类,调用方法
public class Test {
public static void main(String[] args) {
// 创建一部手机
Phone p1 = new Phone("小米",2999);
// 调用手机方法
p1.showInfo();
// 充电
p1.chongdian(5);
// 手机打电话
double q = p1.call("周杰伦",5,10.5);
System.out.println("打电话花了:"+q);
Phone p2 = new Phone("华为",3999);
p2.showInfo();
p2.chongdian(1);
double q2 = p2.call("刘德华",10,11.5);
System.out.println("打电话花了:"+q2);
System.out.println("=================");
System.out.println("使用两部手机打电话一共花了:"+(q+q2));
}
}