当前位置: 首页 > news >正文

Java 面向对象的特征(一)

一、封装

        封装指的是把数据(属性)和对数据的操作(方法)封装在一起,只有通过特定的操作才能够访问到内部数据。

作用:

  1. 隐藏具体的实现细节,只要程序员了解细节即可;
  2. 可以对数据进行验证,使用更加安全,防止不合理的数据。

实现:

  1. 将属性私有化,不能直接对数据进行访问;
  2. 对私有的属性提供get方法,对权限进行判断,用于获取属性具体的值;
  3. 对私有的属性提供set方法,用于对属性的合理性进行判断并给属性赋值。

ps.以上在设置get和set方法的时候可以在当中添加不同的业务逻辑,可以更好地保护数据。

例如以下的封装类:

public class House {//房子中有门、窗户这两个属性private String door;  private int window;public House() {  //空参构造}public House(String door, int window) {  //三个参数的构造器this.door = door;this.window = window;}public String getDoor() {  //门属性的get方法return door;}public void setDoor(String door) {  //门属性的set方法this.door = door;}public int getWindow() {  //窗户属性的get方法return window;}public void setWindow(int window) {  //窗户属性的set方法this.window = window;}
}

        但是以上的类封装中的构造器可能会使封装的功能失效,可以在构造器中调用相应的set方法依然可以保护数据。下面在构造器其中调用set方法给window赋值,并且set方法中判断是否符合一个房子中有超过0个窗户和不超过4个窗户的限制来保证数据的合理性。

在window的set方法来保证数据的合理性:

public void setWindow(int window) {  //窗户属性的set方法if (window > 0 && window < 5) {  //符合就给属性赋值this.window = window;} else {  //不符合就给出提示System.out.println("窗户数量设置不正确!");}}

在构造器中调用window的set方法来赋值:

public House(String door, int window) {  //三个参数的构造器this.door = door;setWindow(window);  //使用set方法来对window赋值
}

二、继承

        原因:当有多个类具有相同的属性和方法的时候,可以把这些属性和方法拿出来放到同一个父类中,再由多个类来继承这个父类,即子类,子类中具备了父类中的属性和方法,同时多个子类也减少了很多内容,提高了代码的复用性,也使代码更加简洁。

特点:

  1. 子类会具有父类的属性和方法;
  2. 父类可以叫父类,基类,超类;
  3. 子类可以叫子类,导出类,派生类。

好处:

  1. 代码的复用性大大提高;
  2. 代码的可维护性和可拓展性更好。

细节:

Ⅰ.子类不能直接访问父类中的私有属性和方法,需要通过共有的方法来访问;

如以下例子:

public class Father {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}class Son extends Father {public void printName() {System.out.println(getName());  //当子类调用父类中的方法的时候需要使用get方法}
}

Ⅱ.子类在创建新的对象的时候,会先调用父类的无参构造器完成对父类的初始化,然后再调用子类的构造器,完成子类的初始化;(子类构造器中会默认有一个super( ))会默认调用父类的构造器,写不写都会有;

例如以下例子:

public class Father {public Father() {System.out.println("我是父类的构造器");}public static void main(String[] args) {Son son = new Son();}
}class Son extends Father {public Son() {//这里即使不写会默认有一个super();System.out.println("我是子类的构造器");}
}

运行的结果为:

Ⅲ.如果父类中没有提供无参构造器,那么在子类的构造器中必须使用super指定调用哪个构造器,否则会无法通过编译。

 例如以下例子:

public class Father {private String name;public Father(String name) {  //父类中只有带参构造this.name = name;}
}class Son extends Father {public Son(String name) {super(name);  //必须使用super来指定构造器否则就会报错}
}

Ⅳ.如果要调用父类中的特定的构造器,需要使用super显式地调用一下super( );

Ⅴ.super()的使用必须放在第一行,super()只能在构造器中使用,不能在成员方法中使用;

 例如以下例子:

public class Father {public Father() {  //父类的构造器System.out.println("父类的构造器");}
}class Son extends Father {public Son() {super(); //super()在这里必须放在第一行,否则无法通过编译System.out.println("子类的构造器");}
}

Ⅵ.super和this都只能放在构造器的第一行,所以这两个不能放在同一个构造器中使用;

Ⅶ.Java所有的类都是object的子类;

如以下例子:

public class Test {public static void main(String[] args) {Test test = new Test();System.out.println(test instanceof Object);}
}

运行结果如下:

结果为true,因此说明test作为一个Test类型的类,也是Object的子类。

Ⅷ.父类构造器的调用不仅限于直接父类,会一直向上追溯到object类;

Ⅸ.Java是单继承机制,即一个子类只能继承一个父类;

Ⅹ.不能滥用继承机制,要满足is-a的关系,而不是like-a的关系。

         比如狗、猫、青蛙都是动物,是is-a的关系,所以可以满足继承的机制;而如果说天上的云像棉花糖、像小鸡,是like-a的关系,那么就不能满足继承关系。

http://www.lryc.cn/news/587371.html

相关文章:

  • Actor-Critic重要性采样原理
  • 在高并发场景下,仅依赖数据库机制(如行锁、版本控制)无法完全避免数据异常的问题
  • 用豆包AI云盘保存和分析录音文件
  • 维基艺术图片: 数据标注 (2)
  • java: DDD using oracle 21c
  • 树莓派5-ollama-linux-arm64.tgz 下载
  • KL散度:信息差异的量化标尺 | 从概率分布对齐到模型优化的核心度量
  • 强化学习初探及OREAL实践
  • Leaflet面试题及答案(61-80)
  • Flink数据流高效写入MySQL实战
  • XCZU2CG-2SFVC784I Xilinx FPGA AMD Zynq UltraScale+ MPSoC
  • Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)
  • 六、深度学习——NLP
  • 无缝衔接直播流体验
  • 早期 CNN 的经典模型—卷积神经网络(LeNet)
  • 板凳-------Mysql cookbook学习 (十一--------8)
  • 【深度学习新浪潮】什么是新视角合成?
  • STM32-第五节-TIM定时器-1(定时器中断)
  • JAVA并发——synchronized的实现原理
  • 特征选择方法
  • 一文打通MySQL任督二脉(事务、索引、锁、SQL优化、分库分表)
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • AEC线性处理
  • 【iOS】方法与消息底层分析
  • 【设计模式】命令模式 (动作(Action)模式或事务(Transaction)模式)宏命令
  • phpMyAdmin:一款经典的MySQL在线管理工具又回来了
  • 【RA-Eco-RA6E2-64PIN-V1.0 开发板】ADC 电压的 LabVIEW 数据采集
  • 第一个Flink 程序 WordCount,词频统计(批处理)
  • git实操
  • 鸿蒙项目构建配置