目录
一、面向过程与面向对象
面向过程与面向对象都是一种思想,面向对象是相对于面向过程而言的。面向过程,强点的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调了具备功能的对象,以类/对象作为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常生活中的逻辑中采取的方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象的三大特征
封装
继承
多态
面向对象的思想概述
面向对象分析问题的思路和步骤:
1、根据问题需要,选择问题所针对的现实世界中的实体。
2、从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
3、把抽象的实体用计算机语言进行描述,形成计算机世界中的类的定义。即借助某种程序语言,吧类构造成计算机能识别和处理的数据结构。
4、将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
二、Java语言中的基本元素:类和对象
面向对象中类和对象的理解及二者的关系
类和对象是面向对象的核心概念。
类是对一类事物的描述,是抽象的,是概念上的内容;
对象是具体存在的该类事物的每个个体,在内存中占据了一定的空间。(实例)
对象是类由派生出来的。
可以理解为:类:抽象概念的人;对象:实实在在的某个人
面向对象的设计重点就是面向类的设计,而对类的设计,其实就是对类的成员的设计。
类
类及类的成员
常见的类的成员有:
属性:对应类中的成员变量;
行为:对应类中的成员方法;
类的语法格式
修饰符 class 类名{
属性声明;
方法声明;
}
说明:
1、修饰符public:类可以被任意访问;
2、类的正文要用{}括起来
创建Java自定义类
步骤:
1、定义类(卡考虑修饰符、类名)
2、编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
特别:类的属性有默认初始化值
3、编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
类的访问机制
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static,编译不通过)
在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中的成员。
对象
对象的创建和使用
java类的实例化,即创建类的对象。
创建对象的语法:类名 对象名=new 类名();
使用“类名.对象成员”的方式访问对象成员(包括属性和方法) (非static类)
public class OOPTest001 {
public static void main(String[] args) {
//创建对象
Person light =new Person();
//调用属性:对象名.属性名
light.age=20;
zss.name="light";
//调用方法:对象名.方法名
light.canSay();
}
}
//创建类
class Person{
//属性
int age;
String name;
boolean isMale;
//方法
public void canSay() {
System.out.println("i can say!");
}
}
内存解析
堆:此内存区域中唯一目的就是存放对象实例(new出来的对象),几乎所有的对象实例都在这里分配内存。这一点在java虚拟机对的描述是:所有的对象实例以及数组都要在堆上分配内存。
对象的属性(非static)加载到堆空间中。
栈:通常所说的栈,是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(Boolean、char、byte、short、int、long、float、Double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
说明:
1、java编译完源程序后,生成一个或多个字节码文件,我们使用JVM的类的加载器和解释器对生成的字节码文件进行编译解释(此处涉及到内存解析)。
2、引用类型的变量只可能存两类值:null或地址值(含变量类型)
匿名对象
我们也可以不定义对象的句柄,而直接调用这个对象的方法。即创建的对象,没有显式的赋给一个变量名,这样的对象叫做匿名对象
eg: new Person().shout();
使用情况:
1、如果对一个对象只需要进行以此方法调用,那么就可以使用这个匿名对象。
2、通常将匿名对象作为实参传递给一个方法调用。
说明:当匿名对象作为一个实参传递给一个方法调用时,该方法所接受这个对象的形参可以被多次调用
3、匿名对象只能调用一次。
如何理解万事万物皆对象
1、在java语言中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
2、涉及到java语言与前端HTML、后端数据库中,前后端的结构在java层面交互时都体现为类、对象。
类的成员之一:属性(Field)
语法格式
修饰符 数据类型 属性名 = 初始化值;
说明1:修饰符
1、常用的修饰符有:private、缺省、protected。public
2、其他修饰符:static、final
说明2:数据类型
任何基本数据类型或引用数据类型
说明3:属性名
属于标识符,符合命名规则和规范即可
变量的分类:成员变量和局部变量
在方法以外,类体内声明的变量称为成员变量
在方法体内部声明的变量称为局部变量(方法形参、代码块内、构造器内、构造器形参)
成员变量(属性)和局部变量的区别
不同:
成员变量 | 局部变量 | |
---|---|---|
声明的位置 | 直接声明在类中 | 方法形参或内部、代码块内。构造器内 |
修饰符 | private、public、static、final等 | 不能使用权限修饰符,可以用final修饰 |
初始化值 | 有默认初始化值 | 没有默认初始化值,必须显式赋值 |
内存加载位置 | 堆空间或静态域内 | 栈空间 |
说明:
1、修饰符:体现结构被调用时可见性大小;可以在声明属性时使用权限修饰符指明其权限;
2、初始化值:形参在调用时赋值即可
相同
1、定义变量格式相同:数据类型 变量名=变量值;
2、先声明,后使用
3、都有其对应的作用域
对象属性的默认初始化赋值
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型。
成员变量类型 | 初始值 |
---|---|
btye | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或写为‘\u0000’(表现为空) |
bollean | false |
引用类型 | null |
类的成员之二:方法(Method)
什么是方法
方法是类或对象行为特征的抽象,用来完成某个功能的操作。在某些语言中也称作函数或过程。
将功能封装为方法的目的是,可以实现代码的重用,简化代码。
java里的方法不能独立存在,所有的方法必须定义在类里。
方法的声明格式
修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2...){
方法体程序代码
return 返回值;
}
其中:
修饰符: public,缺省,private,protected等
返回值类型:
没有返回值:void
有返回值:声明返回值类型。与方法体中“return 返回值”搭配使用
说明:return后不可声明语句
方法名:属于标识符,命名时遵循标识符的命名规则和规范,“见名知意”
形参列表:可以包含0个,一个或多个参数。多个参数时,中间用“,”隔开
返回值:方法在执行完毕后返还给调用他的程序的数据
如何理解方法返回值为void的情况?
可以不用return,但是如果使用,则只能是“return;”表示结束此方法的意思。
方法的分类:按照是否有形参及返回值
无返回值 | 有返回值 | |
---|---|---|
无形参 | void 方法名(){} | 返回值类型 方法名(){} |
有形参 | void 方法名(形参列表){} | 返回值类型 方法名(形参列表){} |
方法的调用
方法通过方法名被调用,且只有被调用时才会执行
方法调用的分析过程
注意:
1、方法被调用一次,就会执行一次
2、没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句,如果使用,仅用来结束方法。
3、定义方法时,方法的结果应该返回给调用者,交由调用者处理。
4、方法中只能调用方法或属性,不可以在方法内部定义方法
练习
1.创建一个Person类,其定义如下:
要求:(1)创建Person类的对象,设置该对象的name、 age和sex属性,调用study方法,输出字符串 “studying”,调用showAge()方法显示age值,调用 addAge()方法给对象的age属性值增加2岁。
public class OOPTest002 {
public static void main(String[] args) {
Person per1=new Person1();
per1.age=18;
per1.study();
per1.showAge();
int tureage=per1.addAge(2);
System.out.println("tureage= "+tureage);
System.out.println("age: "+per1.age);
}
}
class Person{
String name="zss";
int age;
int sex=1;
public void study() {
System.out.println("studying");
}
public void showAge() {
System.out.println("age: "+age);
}
public int addAge(int i) {
age+=i;
return age;
}
}
运行结果如下:
2、对象数组题目:
定义类Student,包含三个属性:学号number(int),年级state(int),成绩 score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息 提示: 1) 生成随机数:Math.random(),返回值类型double; 2) 四舍五入取整:Math.round(double d),返回值类型long。
一、二问合并代码如下:
public class OOPTest004 {
public static void main(String[] args) {
//声明Student类型的数组
Student[] stu=new Student[20];
for(int i=0;i<stu.length;i++) {
//创建stu[i]对象
stu[i]=new Student();
stu[i].number=i+1;
//年级1-6年级
stu[i].state=(int)(Math.random()*(6-1+1)+1);
//成绩0-100
stu[i].score=(int)(Math.random()*(100-0+1)+0);
}
for(int i=0;i<stu.length;i++) {
System.out.println("学号为"+stu[i].number+ "的学生年级为"+stu[i].state+"成绩为"+stu[i].score);
}
System.out.println("**************************");
for(int i=0;i<stu.length;i++) {
if(stu[i].state==3) {
System.out.println("state=3的学生学号为"+stu[i].number+
" 的成绩为 "+stu[i].score);
}
}
System.out.println("**************************");//以下冒泡排序
for(int i=0;i<stu.length-1;i++) {
for(int j=0;j<stu.length-1-i;j++) {
if(stu[j].score>stu[j+1].score) {
//如果要换顺序,交换的是对象
Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
for(int i=0;i<stu.length;i++) {
System.out.println("学号为"+stu[i].number+ "的学生年级为"+stu[i].state+"成绩为"+stu[i].score);
}
}
}
class Student{
int number; //学号
int state; //年级
int score; //分数
}
运行结果为:
随机生成的学生信息
打印出3年级(state值为3)的学生信息。
按照成绩进行冒泡排序