第四章 面向对象
Java 面向对象学习的三条主线:
Java 类及类的成员:属性,方法,构造器,代码块,内部类
面向对象的三大特征:封装性,继承性,多态性,(抽象性)
其他关键字:this,super,static,final,abstract,interface,import等
4.1 面向过程与面向对象
4.1.1 面向过程(POP)与面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑该怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象,分类,继承,聚合,多态等 。
4.1.2 面向对象的三大特征
封装(Encapsulation),继承(Inheritance),多态(Polymorphism)
4.1.3 面向对象的思想概述
程序员从面向过程的执行者转化成了面向对象的指挥者
面向对象分析方法分析问题的思路与步骤:
①.根据问题需要,选择问题所针对的现实世界中的实体
②.从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类
③.把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义,即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构
④.把类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具
4.2 Java语言的基本元素:类和对象
4.2.1 类(Class)和对象(Object)是面向对象的核心概念
类是对一类事物的描述,是抽象的,概念上的定义
对象是实际存在的该类事物的每个个体,因此也称为实例(instance)
万事万物皆对象:
①.在Java语言范畴中,我们都将功能,结构等封装到类中,通过了类的实例化,来调用具体的功能结构
②.涉及到Java语言与前段html,后端数据库交互时,前后端的结构在Java层面交互时,都体现为类,对象
面向对象程序设计的重点是类的设计;类的设计,其实就是类的成员的设计
4.2.2 Java类及类的成员
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java代码世界是由诸多个不同功能的类构成的。
现实生物世界中的细胞又是由什么构成的呢?细胞核,细胞质,....那么,Java中用类class来描述事物也是如此。常见的类的成员有:
属性:对应类中的成员变量
行为:对应类中的成员方法
创建类的对象 = 类的实例化 = 实例化类
Field = 属性 = 成员变量,Method = (成员)方法 = 函数
4.2.3 对象的创建和使用
创建类,设计类的成员
创建对象来实现类,通过“对象.属性”或“对象.方法”调用对象结构
输出结果为:Tom
如果创建出一个类的多个对象,则对象之间的属性各不通用,每个对象有自己的一套类的属性
4.2.4 匿名对象的使用
匿名对象:我们创建的对象,没有显式的赋给一个变量名。即为匿名对象,在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储
特点:由于我们没有记录堆内存对象的地址值,所以只能用一次,再次使用就找不到了;匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间
//定义一个学生类
public class Student{
//创建一个学习方法
public void study(){
System.out.println("好好学习,天天向上");
}
}
//测试类
public class Demo{
public static void main(String[] args){
//创建有名字的学生对象
Student s = new Student();
s.study();
//注意,匿名对象只能使用一次,以下方式即为创建了两个匿名对象
new Student();//创建匿名对象但是并未进行任何操作
new Student().study();//创建匿名对象并调用study()方法
}
}
4.2.5 对象的内存解析
引用类型的变量,只可能存储两类值:null或地址值(含变量的类型)
4.2.6 属性(成员变量)与局部变量之间的对比
相同点:
①.定义变量的格式:数据类型 变量名 = 变量值
②.先声明,后使用
③.变量都有其对应的作用域
不同点:
①.在类中声明的位置不同
②.关于权限修饰符的不同
③.默认初始化情况
④.在内存中加载位置
4.3 方法 (method)
4.3.1 类中方法的声明和使用
①.方法:描述类应该具有的功能
②.方法的声明:权限修饰符 返回值类型 方法名( 形参列表 ){ 方法体 }
③.方法的权限修饰符:Java规定的四种权限修饰符:ptivate,public,缺省,protected
④.方法的返回值类型:如果方法有返回值,则必须在方法声明时,指定返回值类型。同时,方法中,需要使用return关键字来返回指定类型的变量和常量:“return 数据”。如果没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不使用return。但是,如果使用的话,只能“return;“表示结束方法的意思。
⑤.方法名:属于标识符,遵循标识符的规则与规范,”见名知意“
⑥.形参列表:方法可以声明0个,1个,或多个形参
形参格式:数据类型 形参1,数据类型 形参2,.......
⑦.方法体:方法功能的体现
⑧.方法的使用中,可以调用当前类的属性和方法;特殊的,方法A中又调用了方法A称之为”递归方法“
4.3.2 方法的调用
public class Student {
public String name;
public int age;
public String major;
public String interests;
public String say(){
return "学生的个人信息:"+this.name+","+this.age+","+this.major+","+this.interests;
}
public static void main(String[] args) {
Student student = new Student();
student.name ="lisi";
student.age=18;
student.major="read";
student.interests="football";
String say = student.say();
System.out.println(say);
}
}
//Person
public class Person {
public String name;
public int age;
public int sex;
public void study(){
System.out.println("studying");
}
public void showAge(){
System.out.println(age+"岁");
}
public int addAge(){
return age+2;
}
public static void main(String[] args) {
Person person = new Person();
person.name = "lisi";
person.age = 2;
person.sex = 11;
person.study();
person.showAge();
System.out.println(person.addAge()+"岁");
}
}
import java.util.Scanner;
//计算圆的面积
public class Circle {
//创建半径属性r
public double r;
//创建面积公式方法
public double CircleS(double r){
return r*r*Math.PI;
}
public static void main(String[] args) {
Circle circle = new Circle();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入半径r:");
double v = circle.CircleS(scanner.nextInt());
System.out.println("面积为:"+v);
}
}
//对象数组题目有
import java.util.Random;
public class Student {
public int number;
public int state;
public int score;
public static void main(String[] args) {
Student[] students = new Student[20];
Random random = new Random();
for (int i = 0; i < students.length; i++) {
students[i] = new Student();
students[i].number = i + 1;
students[i].state = random.nextInt(5) + 1;
students[i].score = random.nextInt(100) + 1;
//打印年级为3的学生信息
if (students[i].state == 3) {
System.out.println("学号:" + students[i].number + " " + "年级:" + students[i].state + " " + "成绩:" + students[i].score);
}
}
System.out.println("----------------------------");
//使用冒泡排序按照学习成绩排序
for (int i = 0; i < students.length; i++) {
for (int j = 0; j < students.length - 1; j++) {
if (students[j].score > students[j + 1].score) {
Student student = students[j];
students[j] = students[j + 1];
students[j + 1]= student;
}
}
}
//循环遍历排序后的学生信息
for (int i = 0; i < students.length; i++) {
System.out.println("学号:" + students[i].number + " " + "年级:" + students[i].state + " " + "成绩:" + students[i].score);
}
}
}