示例:学生类(名称,年龄)。在没有封装对name和age的访问时所带来的问题。
package bu18;
publicclass Test2 {
publicstaticvoid main(String[] args){
Student stu1 = new Student();
stu1.name = "张三";
stu1.age = -20;
System.out.println(stu1.name);
System.out.println(stu1.age);
}
}
class Student{
public String name;
publicintage;
}
输出:年龄小于零,不合乎逻辑。但是程序运行却是正常的,并没有报错。所以通过“.”直接访问成员变量的做法是不对的。
改进(规范):
1、 所有成员变量设置为private
2、 所有成员变量添加getter和setter方法。通常方法都是public的。
3、 在setter中设置成员的值,而在getter方法只是作单纯的显示功能。
原则:所有的赋值语句都在set方法中,而get方法只是简单地返回值。
class Student{
private String name;
privateintage;
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
if(age<0 ||age>150){
System.out.println("日志:输入年龄不合法。"+age);
age = 18;//学生默认18岁
}
this.age = age;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
}
封装总结:
1、 减少代码冗余,提高重用性
2、 提供一种访问机制,让使用者不能直接访问成员变量(常言道:通过公有方法来访问私有变量)。
3、 降低使用难度,使代码使用更为简单。
思考:在get方法中写,还是在set方法中写?
分享到:
相关推荐
JavaScript 继承之为什么要继承 JavaScript 中的继承机制是指子类继承父类的属性和方法,使得子类可以拥有父类的所有特征。继承是面向对象编程的基本机制之一,它可以实现代码复用、提高编程效率和增强代码的可维护...
继承的使用 (1)声明一个人类Person,放入以你的姓名为包名的包中,姓名为private类型属性,性别为protected类型变量,年龄为默认访问类型变量;该类有两个构造方法Person()和Person(姓名,性别,年龄),构造...
在C#编程语言中,泛型是面向对象编程的一...总的来说,C#中的泛型类和继承机制相结合,为开发者提供了强大的工具来构建模块化和高效的代码。通过理解并熟练运用这些概念,你可以编写出更易于维护、扩展和复用的C#程序。
当子类的构造方法被调用时,会先执行父类的构造方法(如果有的话),这就是为什么在`Child`的构造方法中我们看到`super(name)`,它确保了父类的`name`也得到正确初始化。然后,子类自己的初始化逻辑才会被执行,即`...
游戏角色设计课题 练习课题:游戏角色设计课题。 角色 名称name 攻击力iattacklevel(100) 生命值ilife(100) 防御% fshield 普通攻击方法 Attack 大招,每个角色 大招不同 UniqueSkill 受攻击时做出反应...
这是因为Java遵循多态性原则,即子类对象可以被视为父类对象,但其行为可以体现出子类的特性。 ```java public class Main { public static void main(String[] args) { Child child = new Child(); child....
本节课程主要介绍C++中继承与派生的概念和使用方法,包括公有继承、私有继承和保护继承等不同的继承方式。通过实验和实践,掌握继承与派生的基本概念和使用方法。 继承的概念 继承是面向对象编程中的一种机制,它...
本篇文章将深入探讨如何在JPA中映射关联和实现继承。 **一、JPA关联映射** 1. **一对一(OneToOne)映射**:一个实体对象对应数据库中的一个记录。通过`@OneToOne`注解来实现,可以是单向或双向。`@JoinColumn`...
- **信号与槽(Signals & Slots)**:Qt的事件驱动机制,通过继承QObject,可以使用信号和槽进行通信。 - **QWidget类**:用于构建图形用户界面的基本组件,继承自QObject。 - **自定义控件**:可以通过继承已有...
这个文件很可能是包含了基窗体和一个或多个子窗体的C#项目,通过阅读和分析代码,你可以了解如何定义和使用窗体继承。注意观察如何定义基窗体类,以及子窗体如何继承基窗体并添加自己的特性。通过这样的学习,你将...
在这个名为"java继承部分课件"的资料中,我们可以期待学习到关于Java继承的基础知识、应用场景以及最佳实践。 在Java中,继承是通过使用`extends`关键字来实现的。例如,如果我们有一个名为`Animal`的父类,我们...
原型链继承是通过将一个对象设置为另一个对象的原型,从而实现继承的一种方法。这种方式简单直观,但存在一些缺点,比如不能向父类传递初始化参数,且所有实例共享同一个属性。 **示例代码解析**: ```javascript ...
在多继承的情况下,如果一个派生类同时继承了两个或多个基类,而这些基类又共享了一个共同的基类,那么不使用虚基类会导致"菱形问题",即派生类会有多个同一基类的副本。为解决这个问题,我们可以声明基类为虚基类,...
在Java编程语言中,类的继承是面向对象编程的一个核心概念,它允许我们创建新的类(子类)基于...通过实践,尝试创建自己的类层次结构,使用继承、接口和抽象类来解决问题,这将加深对这些概念的理解,并提高编程技能。
1. **代码复用**:所有继承`MyCustomWindow`的窗口都可以使用其上的通用方法和属性。 2. **更好的组织**:将通用功能封装到一个基类中,可以使代码结构更清晰。 3. **易于维护**:修改基类会影响到所有子类,便于...
在C++中,定义单继承的派生类可以使用以下格式: ```cpp class 派生类名 : 公有继承 基类名 { // ... }; ``` 定义多继承的派生类可以使用以下格式: ```cpp class 派生类名 : 公有继承 基类名1, 继承方式2 基类名2,...
在C#中,我们可以使用":"运算符来表示类之间的继承关系。例如,如果我们有一个基础窗体类`BaseForm`,我们可以创建一个新窗体`DerivedForm`,像这样: ```csharp public class DerivedForm : BaseForm { // 新的...
总的来说,多重继承在适当的情况下可以增强程序的灵活性,但应谨慎使用,尤其是在涉及到钻石继承的情况。正确理解和应用虚拟继承是避免二义性并解决钻石继承问题的关键。在实际编程中,可以考虑使用接口(interface...
然而,尽管多重继承提供了灵活性,但也要谨慎使用。过度依赖多重继承可能导致类层次结构复杂,增加理解和调试的难度。因此,在设计类结构时,应优先考虑单一继承,只有在确实需要组合多种特性的场景下才考虑多重继承...
4. **寄生组合继承**:为避免上述问题,可以在子类构造器中调用父类构造器,然后使用`Object.create`或`for...in`复制父类`prototype`,避免了父类构造器的重复调用。 5. **ES6的类继承**:虽然JavaScript ES6引入...