level5 类简介-编写你自己的类、构造函数
经典的类
1、Java 类
解释 1。程序由各种类型的对象(类)组成。同样,不同的类包含不同的内部结构(变量和方法)。如果我们将程序看作一个整体,那么组成它的构造块就是对象。类是构造块的类型。换句话说,不同类型的构造块是不同类的对象。
解释 2。需要新的对象类型时,我们将创建一个新类并定义其内部对象的行为方式。就内部结构而言,类由执行某些操作的方法及其用于存储数据的变量组成。
2、类基本上是按以下流程创建的:
1)程序员确定需要哪些其他对象。
2)程序员根据对象要执行的操作将其分为不同的类型。
3)程序员为每种类型编写单独的类。
4)在类中,程序员声明所需的方法和变量。
5)在每种方法中,程序员编写命令以使该方法执行所需的操作。
6)类已完成。现在你可以创建该类的对象。
需要将程序划分为对象的编程原理称为面向对象的编程 (OOP)。
总而言之,我们可以说类是一个微型程序:一些数据和使用该数据执行某些操作的函数。类用于创建类的实例,也称为对象。
3、对象有两个有趣的属性:
第一个属性。每个对象都存储自己的实例变量副本。这意味着,如果在一个类中声明了实例变量 x 和 y,并创建了该类的 10 个对象,则每个对象都有自己的变量。更改一个对象中的变量不会影响其他对象中的变量。
第二个属性。创建对象时,你可以传递不同的参数。这些值用于初始化对象。这有点像给新生儿起名字。许多类都需要这些参数来创建类的实例(对象)。
包
包对应于硬盘驱动器上的文件夹。
类的唯一全名由其包名加上类名组成。类的全名始终是唯一的。
最好始终将类放入包内,而不要放在 src 根文件夹中。如果你的类不是很多,那没有问题,但是如果你有很多类,则很容易将它们弄混。应始终在包内创建类。”
创建对象
在 Java 中,普遍做法是对其他类隐藏变量。通常,在类的内部声明的变量具有 private 修饰符。
要允许其他类更改这些变量的值,可为每个变量创建一对方法:get 和 set。get 方法返回变量的当前值。set 方法为变量设置新值。
如果不希望任何人更改实例变量的值,可以不为它创建 set 方法,或者将该变量声明为 private。此外,还可以向该方法添加附加数据检查。如果传递的新值无效,则不会进行任何更改。
初始化对象
创建对象时,你需要为其变量指定初始值,以免出现访问对象不包含正常运行所需信息的情况。
向类中添加 initialize() 方法,以便通过调用该方法来处理对象。我们可以在调用 initialize 方法之后立即调用对象的方法。如果无法处理对象,则称该对象无效;否则,则称该对象有效。initialize 方法的主要任务是接收使对象有效所需的所有数据。
什么时候必须调用 initialize 方法?
——创建对象后立即调用,以使对象生效。
构造方法
在类中声明构造方法很容易。构造方法类似于 initialize 方法,只是有两点不同:
1.构造方法的名称与类名相同(而不是 initialize)。
2.构造方法没有类型(不指定类型)。
不需要用户调用,而是在创建对象时自动执行。
小结:
1、为什么需要构造函数?
创建对象时初始化必要的成员变量,确保对象始终具有有效状态
构造函数里不要有业务逻辑,有可能会引入隐藏的未知风险
2、基类构造方法
基类:多个子类可以有一个共同的祖先
当一个对象被创建时,它的基类的构造函数首先被调用。 只有在构造函数完成后,程序才会执行我们正在创建的对象对应的类的构造函数。当创建子类的对象时,首先调用基类构造函数。
继承类可以访问基类的字段(和方法),不用自己再创建
我们可以在子类构造函数中显式调用基类构造函数。 基类也称为“超类”。 这就是 Java 使用关键字 super 来指示基类的原因。
创建新对象时变量初始化和构造函数调用的顺序:(记住)
1、基类的静态变量被初始化。
2、子类的静态变量被初始化。
3、初始化基类的非静态变量。
4、基类构造函数启动。
5、初始化子类的非静态字段。
6、子类的构造函数被调用
3、getter 和 setter
我们没有正确声明我们的类! 为什么?
-我们公开了类的数据,会造成任意无效的数据
成员变量字段是公开的。 它们可以在程序的任何地方访问:只需创建一个 Cat 对象,任何程序员都可以通过点 (.) 运算符直接访问其数据
如何解决?
-首先,所有实例变量(字段)都必须用 private 修饰符标记。但是这样类将基本无法使用,理想情况下应该程序员可以创建对象,能够从对象读取数据,并且可以分配字段值。
-getter和setter方法可以访问成员变量,也可以为其赋值。它们的名称通常由“get”/“set”加上相关字段的名称组成。
但是,这样仍然可以为字段分配无效的字段,那么有getter和setter方法只有有什么不同呢?
-与字段不同的是,setter 是一种成熟的方法,方法允许您编写必要的验证逻辑,以防止出现不可接受的值。
一个类限制对数据的访问,公开对方法的访问,以保证类不会被破坏。
4、三元运算符Ternary operator
它是您已经遇到过的 if-else 控制流语句的替代方法。
这种情况(“一种条件 - 两种可能的结果”)在编程中极为常见。
这就是创建三元运算符的原因。
if (person.getAge() >= 18) {
usherResponse = "Everything is in order. Come in!";
} else {
usherResponse = "This film is not suitable for your age!";
}
String usherResponse = (person.getAge() > 18) ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
三元运算符的工作方式:
- One condition (
person.getAge() > 18
) - Two possible outcomes ("Everything is in order. Come in!" and "This film is not suitable for your age!")
condition ? outcome 1 : outcome 2
if-else 语句or三元运算符?
就性能而言,没有区别。更准确地说,也许有,但微不足道。
这里最大的考虑是代码的可读性。你编写的代码不仅必须正确运行,而且还必须易于阅读。
一般建议是:如果条件简单且易于验证,则可以使用三元运算符而不会造成伤害。这使您可以减少代码量和 if-else 语句的数量(可能已经有很多了)。