package school;
import java.util.Arrays;
/*
*先封装父类,在封装子类
* 继承:extends
* 目的:充分利用已有的程序
* 是一个的关系,研究生是一个学生,学生是一个人
* 已有的类--父类,超类
* 新创建的类--子类,派生类
* 特点:单继承--一个类只能有一个父类,但是可以有多个子类
* 继承:父类的量和方法(属性和行为),构造方法不能继承,但是可以调用,private修饰的不能继承过来,但是可以set和get方法修改和查看
* 能继承过来,就是自己的,如自己声明的一样,可以随意操作,通过.方式,this.
*
* final ①变量--终结变量,常量;
* ②final class 不能有子类,不能被继承,,可以创建对象,但是我不允许被扩展和修改
* ③final 方法 不能被重写,可以被继承,可以使用,不能修改我
* 子类:属性--继承来的,新增的(实际上也包含没被继承过来的)
* 构造方法--初始化继承来的和新增的,没有被继承过来的父类的构造方法初始化
* --子类的构造方法会默认调用父类的无参构造方法,如果父类没有或不可调用,子类必须显示的调用一个父类的构造方法
* --初始化父类,还有新增的
* --内部--super,继承的初始化,新增的初始化
* 成员方法--继承过来(重写),新增的,
* --继承过来的,直接使用
* --新增的
* 继承的和新增的变量同名--新增隐藏继承,用super区分
* 方法调用的时候,对于同名变量,子类的方法(重写)操作的子类的变量,父类的方法操作的是父类的变量
* final修饰的类和方法特点理解
*
*
*toString
*Object类--所有类的父类 直接父类,间接父类
*所有类都是Object的子类
*所有的类都会从Object类中继承一些方法
*toString方法,所有的类都有此方法
*hashCode,equls
*/
public class CollegeStudent extends Student{
// 类的封装--变量声明+构造方法+成员方法
private String reMajor;
private String department="教育";
private String Major="教育技术";
Teacher teacher=new Teacher("chai");
// public String Major;
// public String[] lessons;
public CollegeStudent() {
// super();
super("John",18);//默认的第一句,用super去调用父类的构造方法;
}
public CollegeStudent(String name,int age,String Major ) {
// super必须是第一句
// this和super不能同时出现
// super(name,age);//默认的第一句,用super去调用父类的构造方法;
this(name,age,Major,"","");
}
// 对于没有继承过来的变量用父类的构造方法,继承过来可以用父类的,也可以新增语句
public CollegeStudent(String name,int age,String Major,String reMjor,String department ) {
// super必须是第一句
super(name,age);//默认的第一句,用super去调用父类的构造方法;
this.Major=Major;
this.reMajor=reMajor;
this.department=department;
}
public CollegeStudent(String name, int age, String reMajor, String department) {
super(name, age);
this.reMajor = reMajor;
this.department = department;
}
// 成员方法
// set和get
public String getReMajor() {
return reMajor;
}
public void setReMajor(String reMajor) {
this.reMajor = reMajor;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getMajor() {
return Major;
}
public void setMajor(String major) {
Major = major;
}
// 方法的重写--访问权限只能放大或不变
// 子类调用的是重写后的方法
// 变量重名时,谁的方法操作的是谁的变量
public void showMajor() {
// Major="子类major";
System.out.println("subclass:"+this.Major);
// System.out.println("superclass:"+super.Major);
}
public String toString() {
return "学生信息:"+"name:"+this.getName()+"\t"
+"age:"+this.getAge()+
"\t"+"id:"+this.getId()
+"\t"+"major:"+this.Major+"\t"+"lessons:"+Arrays.toString(lessons);
}
public void showLesson() {
System.out.println(Arrays.toString(this.lessons));
}
public void showName() {
System.out.println(this.getName());
}
public void showTeacer() {
this.teacher.name="wanglili";
System.out.println(this.teacher.name);
}
// 方法申明一直,访问权限不变和变大
// 重写的目的--判定两个学生的姓名、专业和班级是否一样
// cstu2.equals(cstu3)参数传递执行了向上转型,隐藏了子类新增的,如果想看见新增的,向下转型
// 如果你想比对的是A和B的关系,A.equals(B);B.equals(A)
// 形参的类型,可以声明父类的引用,参数传递范围变大
// 为了防止运行时异常,通常需要去判定所比较的事物属于同一类型
// 向下转型 转到哪一级,根据你判定的问题
public boolean equals(Object obj) {
// 判定一:两个学生的姓名和学号是否相同
if(obj instanceof Student) {
Student cstu=(Student)obj;
return (this.getName()==cstu.getName()) && (this.number==cstu.number);
}
// 判定二:两个大学生的姓名和专业是否相同
// 第一步:比较的两个对象是不是同一类(判定是否进行了向上转型)
if(obj instanceof CollegeStudent) {//判定左边的对象是否是右边类的或其子类的对象--判定的对象是同一个,或者是子类
// if (obj.getClass()==this.getClass()) {
// 第二步:向下转型
CollegeStudent cstu=(CollegeStudent)obj;
// 第三步:根据实际要求判定
return (this.getName()==cstu.getName()) && (this.Major==cstu.Major);
}
else {
return false;
}
}
// 重载
// 只能判定两个大学生的属性,或者是大学生和其子类的属性(Doctor)
public boolean equals(CollegeStudent Object) {
return this.Major==Object.Major && this.department==Object.department ;
}
public static void main(String[] args) {
// CollegeStudent cstu1=new CollegeStudent();
// System.out.println(cstu1.getAge());
// cstu1.showMajor();// 子类调用父类
String str1="123";//常量池--常量是唯一的
String str2="123";
String str3=new String("123");
String str4=new String("123");
CollegeStudent cstu2=new CollegeStudent();
CollegeStudent cstu3=new CollegeStudent();
System.out.println(str1==str2);
System.out.println(str3==str4);
System.out.println(cstu2==cstu3);
System.out.println("---equls----");
System.out.println(cstu2.equals(cstu3));
System.out.println(cstu2.getName());
System.out.println(cstu2.getNumber());
System.out.println(cstu2.getMajor());
System.out.println(cstu3.getName());
System.out.println(cstu3.getNumber());
System.out.println(cstu3.getMajor());
Teacher wang=new Teacher("wang");
System.out.println(cstu2.equals(wang));
// boolean t=wang instanceof CollegeStudent;
System.out.println();
System.out.println("-----*****----");
Doctor qin=new Doctor();
System.out.println(cstu2.equals(qin));
System.out.println("-----*****----");
/*
相等和同一
相等:类型相同,属性值相同
同一:引用相等,同一个对象两个名字
同一肯定相等,相等不一定同一
==,判定的是同一
实际中希望判定 相等,而非同一
对象向上转型:
子类的对象可以赋值给父类的引用
所有的类的对象都可以赋值给Object的引用
如果参数类型是Object的,万能参数
特点:子类对象向上转型之后,新增的属性和行为不可见了,不能操作了,只能操作继承过来的
�
211107-封装、继承、多态、抽象上课讲解案例.rar
需积分: 0 147 浏览量
更新于2023-06-14
收藏 89KB RAR AIGC 举报
在编程领域,面向对象编程(Object-Oriented Programming, OOP)是核心概念之一,而封装、继承、多态和抽象是OOP的四大支柱。这些概念为软件开发提供了结构化和可维护性的基础,使得代码更加灵活和可扩展。下面我们将详细探讨这四个关键概念。
1. 封装:
封装是面向对象编程中的一个重要特性,它允许我们把数据和操作这些数据的方法捆绑在一起,形成一个独立的对象。这种做法可以隐藏对象内部的实现细节,只对外提供公共接口供其他部分使用。通过封装,我们可以控制数据的访问权限,提高代码的安全性和可维护性。例如,在Java中,我们可以通过定义私有变量和公有方法来实现封装:
```java
public class Person {
private String name; // 私有变量,不能直接访问
public void setName(String name) { // 公有方法,用于设置name
this.name = name;
}
public String getName() { // 公有方法,用于获取name
return name;
}
}
```
2. 继承:
继承是子类从父类那里继承属性和行为的过程,使得子类能够复用和扩展父类的功能。这种机制减少了代码重复,提高了代码的重用性。在Java中,我们可以使用`extends`关键字来创建一个类的子类:
```java
public class Student extends Person {
// 子类Student继承了父类Person的所有属性和方法
// 可以在此基础上添加特定于学生的属性和方法
}
```
3. 多态:
多态是指不同对象对同一消息(方法调用)作出不同响应的能力。多态性允许我们使用父类类型的引用操作子类对象,这样可以减少代码的耦合度,提高程序的灵活性。Java中的多态主要体现在方法的重写(Override)和接口的实现上:
```java
public interface Animal {
void sound();
}
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("Woof!");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow!");
}
}
public class Test {
public static void main(String[] args) {
Animal pet1 = new Dog(); // 父类引用指向子类对象
Animal pet2 = new Cat();
pet1.sound(); // 输出 "Woof!"
pet2.sound(); // 输出 "Meow!"
}
}
```
4. 抽象:
抽象是将共同特征抽取出来,形成抽象类或接口的过程。抽象类不关注具体实现,而是关注共性,提供了一种模板设计。接口则是一种完全抽象的类型,只包含方法签名,不包含实现。抽象类和接口使得代码设计更加模块化,便于后期维护和扩展。在Java中,我们可以定义抽象类:
```java
public abstract class Shape {
abstract double getArea();
abstract double getPerimeter();
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
double getArea() {
return Math.PI * radius * radius;
}
@Override
double getPerimeter() {
return 2 * Math.PI * radius;
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
double getArea() {
return width * height;
}
@Override
double getPerimeter() {
return 2 * (width + height);
}
}
```
在这个例子中,`Shape`是一个抽象类,`Circle`和`Rectangle`是它的两个具体实现。它们都实现了`Shape`的`getArea()`和`getPerimeter()`方法,但具体的计算方式因形状不同而不同。
总结来说,封装、继承、多态和抽象构成了面向对象编程的基础,它们共同作用,帮助开发者设计出高效、灵活且易于维护的软件系统。通过对这些概念的理解和熟练应用,我们可以构建出更加符合现实世界模型的软件,提高代码的可读性和可扩展性。

m0_70794496
- 粉丝: 0
最新资源
- 工程项目管理表格2.doc
- 选举分析Excel表格.xlsx
- PSO-BP+NSGAII多目标工艺参数优化(MATLAB完整源码和数据)
- 20XX年网站管理员个人总结.docx
- redis 7.4.5 tar gz
- 小纸片安卓软件网络验证源码附带教程,这套源码可以为安卓软件添加弹窗、卡密等多种功能,非常适合新手开发者使用
- midi16JPBFQ-ZXQMQZQ2.zip
- midi16JPBFQ-ZXQMQZQ1.zip
- midi16JPBFQ-ZXQMQZQ.zip
- app-debug-midi16JPBFQ-ZXQMQZQ.apk
- 飞 花宋体.FeiHuaSongTi
- 更新!地级市-城镇化率(2000-2024年)
- 2025年高教社杯全国大学生数学建模竞赛:C题完整论文+代码结果+思路(全套资源)保姆级教程
- 目标检测-新能源车车牌检测数据集-3000张图-+对应VOC/COCO/YOLO三种格式标签+支持GPU(GPUs)/CPU/Mac三平台YOLO11一键训练脚本
- Armpro卡密注入,脱壳软件,最新版搭建教程附源代码
- springboot236基于springboot在线课程管理系统的设计与实现录像.mp4