面向对象
面向对象
OO(Object Oriented),20世纪80年代后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。
Java 是面向对象的编程语言,对象就是面向对象程序设计的核心,所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。
面向对象对象的特点:1、对象具有属性和行为;2、对象具有变化的状态;3、对象具有唯一性;4、对象都是某个类别的实例;5、一切皆为对象,真实世界中的所有事物都可以视为对象。
面向对象开发有利于开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。
面向对象开发的优点
1、可重用性:代码重复使用,减少代码量,提高开发效率。下面介绍的面向对象的三大核心特性(继承、封装和多态)都围绕这个核心。
2、可扩展性:指新的功能可以很容易地加入到系统中来,便于软件的修改。
3、可管理性:能够将功能与数据结合,方便管理。
面向对象的特性
1、继承性
程序中的继承性是指子类拥有父类的全部特征和行为,这是类之间的一种关系,Java只支持单继承。
2、封装性
封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用,封装的目的在于保护信息。
主要优点:
·保护类中的信息,它可以阻止在外部定义的代码随意访问内部代码和数据;
·隐藏细节信息,一些不需要程序员修改和使用的信息,如:取款机中的键盘,用户只需要知道按哪个键实现什么操作就可以,至于它内部是如何运行的,用户不需要知道。
·有助于建立各个系统之间的 松耦合 关系,提高系统的独立性,当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。如:U盘,不管里面的存储方式怎么改变,只要U盘上的USB接口不变,就不会影响用户的正常操作。
·提高软件的复用率,降低成本,每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个U盘可以在多台电脑上使用。
3、多态性
面向对象的多态性,即:一个接口,多个方法。
多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。
多态性允许一个接口被多个同类使用,弥补了单继承的不足,多态概念可以用树形关系来表示。
面向对象的案例代码
封装,案例代码
public class Student {
private String studentNo;
private String studentName;
private String studentSex;
private int studentAge;
//方案三,将学科对象作为属性
private Subject subject;
public Subject getSubject() {
if (subject == null)
subject = new Subject();
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
//无参构造
public Student() {
}
//多参构造,实现对全部属性的赋值
public Student(String studentNo, String studnetName, String studentSex, int studentAge) {
this.setStudentNo(studentNo);
this.setStudentName(studnetName);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
}
//将Subject对象初始化的构造函数
public Student(String studentNo, String studnetName, String studentSex, int studentAge, Subject subject) {
this.setStudentNo(studentNo);
this.setStudentName(studnetName);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
this.setSubject(subject);
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
if (studentSex == "男" || studentSex == "女")
this.studentSex = studentSex;
else
return;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
if (studentAge <= || studentAge > 100)
studentAge =;
this.studentAge = studentAge;
}
/**
* 介绍学生详细信息的方法(新增方法参数)
*
* @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
*/ public String studentInfo(String subjectName, int subjectTime) {
String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
this.getStudentSex() + "\n所学专业名称:" + subjectName + "\n学制年限:" + subjectTime;
return ref;
}
/**
* 学生详细信息介绍的方法重载(将对象作为方法参数)
*
* @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
*/ public String studentInfo(Subject subject) {
String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
this.getStudentSex() + "\n所学专业名称:" + subject.getSubjectName() + "\n学制年限:" + subject.getSubjectTime();
return ref;
}
/**
* 返回学生相信信息介绍方法(将对象作为类的属性)
*
* @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
*/ public String studentInfo() {
String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
this.getStudentSex() + "\n所学专业名称:" + this.getSubject().getSubjectName() + "\n学制年限:"
+ this.getSubject().getSubjectTime();
return ref;
}
}
public class Subject {
/*
* 封装的步骤一:将属性设置为私有,禁止类外部进行访问
*/ private String subjectName; //专业名称
private String subjectNum; //专业编号
private int subjectTime; //专业学时
private Student[] studentArray; //用来存储选修某专业的学生对象
private int studentCount; //记录选修某专业的人数
public Student[] getStudentArray() {
if (studentArray == null)
this.studentArray = new Student[];
return studentArray;
}
public void setStudentArray(Student[] studentArray) {
this.studentArray = studentArray;
}
//无参构造方法
public Subject() {
}
//有参构造方法
public Subject(String subjectName, String subjectNum, int subjectTime) {
this.setSubjectName(subjectName);
this.setSubjectNum(subjectNum);
this.setSubjectTime(subjectTime);
}
//有参构造
public Subject(String subjectName, String subjectNum, int subjectTime, Student[] studentArray) {
this.setSubjectName(subjectName);
this.setSubjectNum(subjectNum);
this.setSubjectTime(subjectTime);
this.setStudentArray(studentArray);
}
public int getStudentCount() {
return studentCount;
}
public void setStudentCount(int studentCount) {
this.studentCount = studentCount;
}
/*
* 封装类的步骤二:设置类外部访问属性的接口
* 封装类 的步骤三:通过getter/setter方法添加控制语句
*/ //预留访问类的接口
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public String getSubjectName() {
return this.subjectName;
}
public void setSubjectNum(String SubjectNum) {
this.subjectNum = SubjectNum;
}
public String getSubjectNum() {
return this.subjectNum;
}
public void setSubjectTime(int subjectTime) {
if (subjectTime <=)
return;
this.subjectTime = subjectTime;
}
public int getSubjectTime() {
return this.subjectTime;
}
//在类中编写一个输出详细信息的方法
public String printDetail() {
String ref = "专业详细信息为:\n专业名称:" + this.getSubjectName() + "\n专业编号:"
+ this.getSubjectNum() + "\n学时:" + this.getSubjectTime();
return ref;
}
/**
* 添加学员到数组中并记录数组中成员个数
*
* @param student 传递进入方法的学生对象
*/ public void addStudent(Student student) {
for (int i =; i < this.getStudentArray().length; i++) {
if (this.getStudentArray()[i] == null) {
this.getStudentArray()[i] = student;
this.studentCount = i +;
return;
}
}
}
}
public class CharDemo {
public static void main(String[] args) {
Subject subject = new Subject("计算机科学与应用", "j", 4);
System.out.println(subject.printDetail());
System.out.println("-------------在方法中通过新增参数实现扩展-------------");
Student student = new Student("s", "张三", "男", 18);
System.out.println(student.studentInfo("计算机科学与应用",));
System.out.println("------------将对象作为方法参数--------------");
Student student = new Student("s02", "李四", "女", 28);
System.out.println(student.studentInfo(subject));
System.out.println("-------------将对象作为类的属性-------------");
Student student = new Student("s03", "王五", "女", 17, subject);
System.out.println(student.studentInfo());
System.out.println("-------------想知道一个专业到底有多少个学生选修-------------");
subject.addStudent(student);
subject.addStudent(student);
subject.addStudent(student);
System.out.println("选修" + subject.getSubjectName() + "专业的学生有" + subject.getStudentCount() + "名");
}
}
多态 ,案例代码
public class Animal {
// 姓名
private String name;
// 空参构造
public Animal() {
}
// 全参构造
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 成员方法
public void eat() {
System.out.println("吃饭");
}
}
// 是Animal类的子类
public class Dog extends Animal {
// 需求:因为狗吃骨头,所以要优化父类的eat()方法
@ Override
public void eat() {
System.out.println(getName() + "吃骨头");
}
}
public class Demo {
public static void main(String[] args) {
/*
Java中实现多态的三个步骤:、要有继承(或者实现)关系
、要有方法重写
、要有父类引用指向子类对象
*/ // 多态
Animal animal = new Dog();
// 测试成员方法的调用
// 结论:多态中调用成员方法时编译看左(左边的类型有没有这个成员),
// 运行看右(运行时具体用的是右边类中的该成员)
animal.setName("哈士奇");
animal.eat();
}
}