2022.7.4 面向对象进阶(static,继承)

本文介绍了Java中的单例模式实现方法,包括饿汉单例和懒汉单例,并探讨了单例模式的设计目的。此外,还详细讲解了Java继承的概念、特点及设计规范,以及方法重写的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2022.7.4 static&继承

static关键字:静态的意思,可以修饰成员变量,可以修饰成员方法
在这里插入图片描述
在这里插入图片描述

类的5大成分(成员变量、成员方法、构造器、代码块、内部类)
在这里插入图片描述


单例模式:单例是一种设计模式,是为了解决某个问题

单例解决:保证一个类对外只能产生一个对象。

如何实现单例:

1、饿汉单例:

在这里插入图片描述

2.懒汉单例:

在这里插入图片描述


继承:Java允许一个类通过extends与另一个类建立父子关系,子类 extends 父类,子类继承父类后,就可以得到父类的属性和行为,这样提高代码的复用性,多个子类的相同代码可以放在父类中,增强了类的扩展性。

设计规范:子类共用属性和行为放在父类,子类独有属性和行为放在子类自己那里。

继承的特点

1.子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。

2.子类可以继承父类私有成员吗?有争议的,我认为可以,只是不能直接访问。

3.子类可以直接用子类名访问父类静态成员。那么子类继承了父类静态成员吗?? 我认为没有继承,只能可以共享的去访问父类静态成员,共享并非继承。

4.Java是单继承模式:一个类只能继承一个直接父类。(接口另说)

5.Java不支持多继承、但是支持多层继承。

6.Java中所有的类都是Object类的子类。

继承后:成员变量、成员方法的访问特点:就近原则,this.子类自己的成员变量,在子类方法中访问父类成员–super.父类成员变量/父类成员方法

方法重写:子类重写了一个申明与父类一样的方法,覆盖父类的方法。子类认为父类的该方法不好用,以后用自己重写的方法。重写方法建议加上一个重写校验注解:@Override

重写的注意事项:

1.重写方法的名称和形参列表必须与父类被重写方法的名称和形参列表一致(重点)

2.私有方法不能重写,静态方法不能重写,重写方法的权限 >= 被重写方法的访问权限。

继承后:子类构造器的特点:子类的全部构造器默认都会先访问父类的无参数构造器,再执行自己的构造器,这是因为默认子类构造器的第一行都有一个super() 访问父类的无参数构造器,写不写都有。

继承后:子类构造器访问父类有参构造器:调用父类有参数构造器,初始化继承自父类的数据,super(…) 根据参数调用父类构造器

this、super使用总结

1.this访问子类当前对象的成员,super:在子类方法中指定访问父类的成员。

2.this(…) : 访问本类兄弟构造器,super(…):在本类构造器中指定访问父类的构造器

3.注意事项:super(…) 必须放在第一行,this(…) 也必须在第一行。因此两者不能共存一个构造器中。

可以编写以下测试方法来测试上述类的属性和方法: ```java import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { // 创建用户对象 User user = new User("001", "Tom", "123456", "123456789"); System.out.println(user.getInfo()); // 输出用户信息 user.modifyPassword("654321"); // 修改密码 user.login("Tom", "654321"); // 登录 // 创建学生对象 Student student = new Student("002", "Jerry", "123456", "987654321", 80); System.out.println(student.getInfo()); // 输出学生信息 student.test(new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01")); // 进行考试 student.queryGrade(new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01")); // 查询自己的考试成绩 // 创建老师对象 Teacher teacher = new Teacher("003", "Mary", "123456", "987654321", "教授"); System.out.println(teacher.getInfo()); // 输出老师信息 teacher.test(new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01")); // 出试卷 teacher.queryGrade(new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01")); // 查询学生考试成绩 teacher.queryGrade(new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01"), student); // 查询指定学生成绩 // 创建班主任对象 HeadTeacher headTeacher = new HeadTeacher("004", "John", "123456", "987654321", "教授"); System.out.println(headTeacher.getInfo()); // 输出班主任信息 Exam exam = new Exam("001", "Java基础考试", "包括Java基础语法和面向对象编程", "2022-01-01"); headTeacher.queryGrade(exam, "三年级一班"); // 查询班里学生考试成绩 // 创建考试对象和学生考试对象 Exam exam1 = new Exam("002", "Java进阶考试", "包括Java高级特性和多线程编程", "2022-01-02"); List<StudentExam> studentExams = new ArrayList<>(); studentExams.add(new StudentExam(student, exam, 80)); studentExams.add(new StudentExam(new Student("005", "Bob", "123456", "987654321", 90), exam1, 85)); exam.setStudentExams(studentExams); exam1.setStudentExams(studentExams); System.out.println(exam.getAverage()); // 计算平均分 System.out.println(exam1.getAverage()); // 计算平均分 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值