封装
类的基本作用就是封装代码。封装将类的属性和特征隐藏在此类的内部。不允许类外部直接访问。
封装可以被认为是个保护屏障,防止此类的代码和数据被外部类定义的代码随机访问。
我们可以通过类提供的方法来实现对隐藏信息的操作和访问。隐藏了对象的信息,留出了访问的接口。
在我们日常生活中,封装与我们息息相关,智能手机就是一个良好封装的例子,我们不需要关心其内部复杂的逻辑电路设计,可以通过手机的屏障、按键、充电口、耳机接口等等外部接口来对手机操作和使用。复杂的逻辑电路及模块被封装在手机的内部,而留出的这些必要的接口,让我们更加简洁地使用手机的同时也保护手机的内部细节。
封装的两大特点:
- 只能通过规定的方法访问数据
- 隐藏类的实例细节,方便修改和实现。
为什么要封装?
封装有利于提高类的内聚性,适当的封装可以让代码更容易的理解与维护;
良好的封装有利于降低代码的耦合度;
一些关键属性只允许类内部可以访问和修改,增强类的安全性;
隐藏实现细节,为调用方提供易于理解的接口;
当需求发生变动时,我们只需要修改我们封装的代码,而不需要到处修改调用处的代码
在Java语言中,如何实现封装呢?需要3个步骤。
1.修改属性的可见性为private
;
2.创建公开的getter和setter方法,分别用于属性的读写。
3.在getter和setter方法中,对属性的合法性进行判断。
public class NBAPlayer {
// 姓名
private String name;
// 年龄
private int age;
// 无参构造方法
public NBAPlayer() {
}
// 单参构造方法
public NBAPlayer(int age) {
this.setAge(age);
}
// 全参构造方法
public NBAPlayer(String name, int age) {
this.setName(name);
this.setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 判断参数age的合法性
if(age < 0) {
this.age = 0;
}
this.age = age;
}
public static void main(String[] args) {
NBAPlayer james = new NBAPlayer();
// 对属性赋值:
james.setName("詹姆斯");
james.setAge(35);
// 打印james实例属性
System.out.println("姓名:" + james.getName());
System.out.println("年龄:" + james.getAge());
System.out.println("-------------");
// 实例化一个新的对象
NBAPlayer jordan = new NBAPlayer("乔丹", 60);
// 打印jordan对象实例属性
System.out.println("姓名:" + jordan.getName());
System.out.println("年龄:" + jordan.getAge());
}
}
以上就是一个完整的封装代码块
NBAplayer这个类提供了全参的构造方法以及get/set的构造方法,并对相应的参数年龄进行判断,相当于这个类就被封装了,这样main方法就可以调用这个类就可以了。无需其他的判断等。
继承
继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
格式:
public class 子类名 extends 父类名{}
范例:
public class Zi extends Fu {}
Fu:父类,也被称为基类,超类
Zi:子类,也被称为派生类
父类拥有的子类也可以拥有,子类不但拥有父类的,还可以拥有自己独特的内容所以就会有如下的有点:提高了代码的复用性(多个类相同的成员可以放到同一个类中),但是也会有缺点就是:继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时,子类也不得不跟着发生变化,削弱了子类的独立性。
继承值得注意的一点就是:Java目前只支撑单继承而不支持多继承
话不多说,图先奉上:
多态:
多态就是一个对象在不同时刻表现出来的形态
那么如何理解多态呢?例如:void method(Father instance): instance.callmethod();现在有两个子类 girl 和 boy . 如果我传入给method的对象是girl,那么instance.callmethod()是否就等同于girl.callmethod(),如果传入的是boy,就等同于boy.callmethod().但是对于程序而言,表达式一直都是 void method(Father instance): instance.callmethod();没有改变过只不过通过传入不同的子类对象使这样一个表达式表现出了多种“类的形态”。这样的现象就叫做多态。
多态最值得注意的一点就是:编译看左边,执行看右边