面向对象之类与对象
1. 了解面向过程和面向对象的思想
面向过程 (面向方法、面向函数、结构化方法): 也是一种编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象(OOP) : 就是一种编程思想,是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。它是基于面向过程产生的一种更复杂的编程思想/编程方式。从现实世界抽象而来的!它的代码执行顺序不固定。
Java是不完全的面向对象、Python面向对象 、C#面向对象 、C++面向对象 、PHP也是面向对象的编程语言。
小例子:卖煎饼。(面向对象是项目复杂化、规模化的必然产物。
)
刚开始(面向过程):自己去采购 -> 自己准备好材料 -> 自己出摊 -> 自己迎接客人 -> 自己做煎饼 -> 自己收银 -> 自己收摊。
后面发达了(面向对象):采购部采购 -> 餐饮部准备材料 -> 服务员准备迎接客人 -> 厨师做菜 -> 收银员收银 -> 服务员收摊。
2. 理解类和对象的关系
类和对象 :类是模板;对象是以类为模板创建的 (工厂生产产品,得有一个模子,根据模子设置设备生产)
类:描述一类事物,或看成一个分类,一个类就相当于一个模板,是不具体的
对象:指一个具体的个体
通常都会将对象划分为两个部分,即动态部分【行为】与静态部分。
①静态部分(属性):顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。
②动态部分(行为):然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分)
生活中的对象
万物皆对象:你身边的任何一个物体/实体都可以称之为对象。
我们在描述生活中的一个个对象时通常都会采用特征+行为的方式。
特征:属性
行为:操作、方法
对象的概念:用来描述客观事物的一个实体,由一组属性和方法构成。
生活中的类
我们在看到一群对象/实体时,会下意识进行分类(人类认识事物的必然过程)。“物以类聚、人以群分”
学生(类别)、人类、哺乳类、爬行类、猫类、灵长类、啮齿类…
类(类别):它是一个抽象的概念,它是从一群对象中抽取共性的特征和行为产生的一个概念。没有办法具体拿某个对象来表示某个类别,因为对象只是类的一个个体。
程序中的类和对象
Java 是一个"不完全"的面向对象的编程语言。(因为有基本数据类型存在)
它以类(引用数据类型)为基本单位,被class修饰的。
基本数据类型:byte 、short 、int 、long、 float、 double、 char、 boolean
引用数据类型:数组、类(String就是一个类)、接口、枚举…
程序中的类和对象都是从生活中抽象而成的,你在现实中如何描述它们,程序中也是。
3. 掌握类创建的方式
在Java之中类是一个独立的结构体,所以需要使用class来进行定义,而在类中主要由属性和方法组成,
那么在类中的属性就是一个个具体的变量,方法就是可以重复执行的代码。
在这个类之中定义有两个属性(name、age)和一个方法(tell()) 于是说现在有了类之后
如果想使用类,必须通过对象来完成,而如果要产生对象,则必须使用以下语法格式来完成
声明并实例化对象:类名称 对象名称 = new 类名称();
分步骤完成:
声明对象:类名称 对象名称 = null;
实例化对象:对象名称 = new 类名称();
当获取了实例化对象之后,那么就需要通过对象对类中的属性和方法调用
此时有两种调用方式:
①、调用类中的属性:实例化对象.成员属性;
②、调用类中的方法:实例化对象.方法名称();
当你不对属性值进行设置的时候,则该属性值为对应数据类型的默认值;
String 默认值为:null
int 默认值为:0
创建一个类
public class 类名{
成员变量 (字段); //属性
方法 (具体的一个功能行为); //行为
构造方法
}
public class Student{ //描述了学生这一类的事物
public String name; //属性:姓名 【成员变量 】
public int age; //属性:年龄 【成员变量 】
public void eat(){ } //行为:方法
}
例如:
public class Teacher {
/**老师姓名*/
public String name;
/**老师性别*/
public char gender;
/**老师专业*/
public String major;
/**老师教龄*/
public int teachAge;
/**输出老师信息*/
public void xinXi(){
System.out.println("姓名:"+name+"\n性别:"+gender+"\n专业:"+major+"\n教龄:"+teachAge);
}
}
定义一个学生类:
public class Student {
// 一组属性(成员变量)
/** 学生姓名 */
public String stuName;
/** 学生编号 */
public int stuNo;
/** 学生班级 */
public int classId;
/** 学生专业 */
public String major;
/** 学生性别 */
public char gender;
/** 学生年龄 */
public int age;
/** 学生成绩 */
public double score;
// 一组方法(成员方法)
// public static void main(String[] args){}
/**
* 学习方法
*/
public void study() {
System.out.println(major+"专业的"+classId+"班级的"+stuName+"正在好好学习!");
}
/**
* 自我介绍
*/
public void showMyself() {
System.out.println("姓名:"+stuName);
System.out.println("班级:"+classId);
System.out.println("专业:"+major);
System.out.println("性别:"+gender);
System.out.println("年龄:"+age);
System.out.println("成绩:"+score);
System.out.println("学号:"+stuNo);
}
}
4. 掌握对象创建的方式
创建一个对象
数据类型 变量名 = new 类名( ); (注意:java就近原则)
赋值 --> 对象名.字段名 ( Teacher .name = “张三”; )
取值 --> 对象名.字段名 ( Teacher .name )
例如:
public class Testl {
public static void main(String[] args) {
// 创建对象
Teacher teacher = new Teacher();
// 给属性赋值
teacher.name = "某老师";
teacher.gender = '男';
teacher.major = "Java";
teacher.teachAge = 5;
// 调用方法
teacher.xinXi();
}
}
学生类对象:
public class Test {
public static void main(String[] args) {
// 根据类模板产生对象
// 创建对象(对象名的命名规范和变量名一致)
Student chenXu = new Student();
Student shr = new Student();
// 操作/调用属性
shr.stuName = "张三";
shr.classId = 001;
shr.major = "土木工程";
chenXu.stuName = "李四";
chenXu.classId = 002;
chenXu.major = "建筑学";
chenXu.gender = '男';
chenXu.stuNo = 9527;
chenXu.age = 18;
// 操作/调用方法 input.nextInt();
chenXu.showMyself();
chenXu.study();
// shr.study();
// shr.showMyself();
System.out.println(shr.stuName+"的专业是:"+shr.major);
}
}
对象内存分析
对象实例化操作初步分析
Java之中类属于引用数据类型,引用数据类型最大的困难之处在于
要进行内存的管理,同时在进行操作的时候也会发生有内存关系的变化,
所以本次针对与之前的程序的内存关系进行一些简单的分析。
如果要进行内存分析,那么首先要给出两块最为常用的内存空间:
堆内存: 保存的是对象的具体信息。
栈内存: 保存的是一块堆内存的地址,即:通过地址找到堆内存,而后找到对象内容,
但是为了分析简化起见简单的理解为对象的名称保存在了栈内存之中
清楚了以前关系之后,那么下面针对之前的程序进行分析
将属性的值设置后运行程序结果为:姓名:张三、年龄:18.
在之前的内存分析操作中可以发现实例化对象有两种方式:
-
一种是之前使用的声明并实例化对象
2 . 一种是分布完成实例化对象的操作;
下面对于分布的内存操作进行分析:
范例:定义程序代码
结果还是一样不变:姓名:张三、年龄:18.
需要注意的是所有的对象必须在对象实例化完成之后才可以执行。
5. 掌握基本方法创建
面向过程/方法/函数,结构化方法
方法:是功能,是一系列代码的聚合,也可以理解为一个魔术箱。
基本语法:
访问修饰符 返回值类型 方法名(参数列表){ // 方法声明
// 方法体
}
// Arrays.toString(参数); 将数组转换为字符串
public void(表示没有返回值) showMyself(){
syso();
}
功能代码的存储空间,以后使用可以复用。