java面向对象总结(二)
- Java 封装
- java面向对象值继承
2. 概念:
3. 继承的格式:
4. 类和类之间的关系:
5. 继承的特点:
6. 继承的优缺点
1. 继承的好处:
2. 继承的缺点:
7. 继承的注意事项:
8. 使用继承的步骤: - Java 多态
9. 多态的优点
10. 多态存在的三个必要条件 - 重写
11. 方法重写的特点:
12. 注意事项:
Java 封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
实现Java封装的步骤
修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Person {
private String name;
private int age;
}
1.这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
2.对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
实例
让我们来看一个java封装类的例子:
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
以上实例中public方法是外部类访问该类成员变量的入口。
通常情况下,这些方法被称为getter和setter方法。
因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。
通过如下的例子说明EncapTest类的变量怎样被访问:
public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}
以上代码编译运行结果如下:
Name : James Age : 20
java面向对象值继承
概念:
总结: 类是对一批对象的抽象,继承是对一批类的抽象。继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承的格式:
通过extends关键字可以实现类与类的继承
class 子类类名 extends 父类类名 {
}
被继承的这个类称为父类,基类或者超类
继承的这个类称为子类或者派生类
类和类之间的关系:
1.继承 (is a)
2.组合 (has a)
继承的特点:
1.通过extends关键字,实现了继承之后,让类与类之间产生了关系,建立关系是好还是坏? 有好友坏
2.继承的本质就是抽取共性代码,多个重复代码的向上抽取,简化代码
3.类是对一批对象的抽象,继承是对一批类的抽象
4.父类又被称为超类,或者基类,子类又被称为派生类
5.Java是面向对象语言,万事万物皆是对象,为了满足这个设计原则,所有的类都直接或者间接继承自Object类
继承的优缺点
继承的好处:
1.简化了代码
2.提高了扩展性
3.提高了可维护性
开闭原则: 对扩展开放,对修改关闭
继承的缺点:
开闭原则: 对扩展开放,对修改关闭
高内聚,低耦合: 类与类之间,功能与功能之间,模块与模块之间,功能尽量内聚,不同模块之间,尽量独立
1.造成了耦合性过高,牵一发动全身
注意: 继承一定要慎用,主要利用继承简化代码的优点
继承的注意事项:
1.单一继承性
2.支持多层继承
3.如果父类成员使用private修饰,那么子类不能被继承
4.如果一个子类继承了父类的属性和方法还可以有自己特有的属性和方法
5.当子类和父类的成员变量重名的时候,子类优先
6.构造方法不能够被继承
什么时候使用继承?
1.一般在写代码的时候发现代码中存在重复代码,需要向上抽取,考虑继承
2.当某个类的设计非常复杂的时候可以考虑继承 例如: 设计一个窗口类
使用继承的步骤:
1.先写子类
2.观察多个子类是否存在共性代码
3.如果存在,抽取共性代码到父类中
4.子类继承父类
5.将子类共性代码删除
注意: 父类命名: A is a B
import javax.swing.JFrame;
public class ExtendsDemo {
public static void main(String[] args) {
PrimaryStudent ps = new PrimaryStudent();
ps.play();
MyFrame frame = new MyFrame();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setTitle("HelloWorld");
frame.setVisible(true);
}
}
class MyFrame extends JFrame {
}
class Student extends Person{
private String name;
int age = 5;
String gender;
double money;
Cat cat;
public Student() {}
public void payMoney(double money) {
this.money = money;
}
}
class Person extends Object {}
// 小学生类
class PrimaryStudent extends Student {
private String address;
private int age = 10;
public void play() {
int age = 20;
System.out.println("PrimaryStudent.play()");
System.out.println(age);
}
}
// 中学生类
class MiddleStudent extends Student {
public void study() {
System.out.println("MiddleStudent.study()");
}
}
// 大学生类
class BigStudent extends Student {
public void sleep() {
System.out.println("BigStudent.sleep()");
}
}
class Cat {
private String name;
}
Java 多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
多态性是对象多种表现形式的体现。
现实中,比如我们按下 F1 键这个动作:
如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
如果当前在 Word 下弹出的就是 Word 帮助;
在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件
继承
重写
父类引用指向子类对象
比如:
Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
执行以上程序,输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
重写
为什么需要方法重写?
当父类的方法不能够满足子类的需求的时候,需要方法重写
方法重写的特点:
1.发生在具有子父类的两个类中
2.方法名相同
3.参数列表完全相同
4.返回值类型可以相同或者是其子类
5.访问权限修饰符不能够严于父类
访问权限修饰符的宽严关系
public > protected > default > private
6.抛出的异常不能够被扩大
注意事项:
1.private修饰的方法不能够被继承,所以不能够被重写
2.构造方法不能够被重写
3.子类重写父类的方法时,访问权限修饰符不能更低,严格
4.返回值类型相同或者是其子类
5.重载和重写的区别
public class OverrideDemo01 {
}
class Father {
public void sing() {
System.out.println("唱红歌");
}
Father dance() /*throws NullPointerException*/ {
System.out.println("霹雳舞");
Father f = new Father();
return f;
}
}
class Son extends Father {
public void sing() {
System.out.println("唱国歌");
}
@Override
protected Son dance() /*throws Exception*/ {
return new Son();
}
}
多态的实现方式
方式一:重写:
- 这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
方式二:接口 - 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
- java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。
方式三:抽象类和抽象方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!