一、封装
面向对象程序设计具有以下特点:
- 封装性
- 继承性
- 多态性
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。把尽可能多的东西藏起来,对外提供便捷接口。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,用户使用计算机时,只需要使用手指敲击键盘就可以实现一些功能,无须知道计算机内部是如何工作的,即使可能知道计算机的工作原理,但在使用计算机时也并不完全依赖于计算机工作原理这些细节。
采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据。这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。
封装的好处:
- 便于使用者正确使用系统,防止错误修改属性
- 有助于系统之间的松耦合,提高系统独立性
- 提高软件可重用性
- 降低了构建大型系统的风险
代码举例:
public class Pet {
private String name;
private int health;
private int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
}
二、类的访问修饰符
1、类的访问修饰符
- public修饰符:公有访问级别
- 默认修饰符:包级私有访问级别
2、类成员的访问修饰符
3、static修饰符
static可以用来修饰:
成员变量 -> 静态变量,可以直接通过类名访问
成员方法 -> 静态方法,可以直接通过类名访问
代码块 -> 静态代码块,当java虚拟机加载类时,就会执行该代码块。
静态代码块:当虚拟机加载类时,会同时加载静态代码块。如果有多个静态块,按顺序加载,每个静态块只会被执行一次。
public class StaticTest {
static int num=100;
static{
num+=100;
System.out.println(num);
}
static{
num+=100;
System.out.println(num);
}
}
StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();
System.out.println(StaticTest.num);
静态变量:
- 被static修饰的变量
- 在内存中只有一个拷贝
- 类内部,可在任何方法内直接访问静态变量
- 其他类中,可以直接通过类名访问
实例变量:
- 没有被static修饰的变量
- 每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
静态变量的作用:
- 能被类的所有实例共享,可作为实例之间进行交流的共享数据
- 如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间
静态方法:
静态方法必须被实现 ,main()就是最长用的静态方法。
静态方法:可直接通过类名访问
- 静态方法中不能使用this和super
- 不能直接访问所属类的实例变量和实例方法
- 可直接访问类的静态变量和静态方法
实例方法:通过实例访问
- 可直接访问所属类的静态变量、静态方法、实例变量和实例方法
三、继承
当处理一个问题时,可以将一些有用的类保留下来,在遇到同样问题时拿来复用。
假如这时需要解决信鸽送信的问题,我们就会想到鸟类。由于鸽子属于鸟类,具有与鸟类相同的属性和行为,便可以在创建信鸽类时将鸟类拿来复用,并且保留鸟类具有的属性和行为。不过,并不是所有的鸟都有送信的习惯,因此还需要再添加一些信鸽具有的独特属性及行为。鸽子类保留了鸟类的属性和行为,这样就节省了定义鸟和鸽子共同具有的属性和行为的时间,这就是继承的基本思想。
可见设计软件的代码时使用继承思想可以缩短软件开发的时间,复用那些已经定义好的类可以提高系统性能,减少系统在使用过程中出现错误的几率。
如何使用继承:
1、编写父类
[访问修饰符] class Pet {
//公共的属性和方法
}
2、编写子类
[访问修饰符] class Dog extends Pet {
//子类特有的属性和方法
}
Java中只支持单根继承,即一个类只能有一个直接父类。
子类成员访问父类成员:
(1)使用super关键字,super代表父类对象
(2)在子类构造方法中调用且必须是第一句
(3)不可以访问父类中定义为private的属性和方法
(4)super只能出现在子类的方法和构造方法中
1、访问父类构造方法
super();
super(name);
2、访问父类属性
super.name;
3、访问父类方法
super.print();
继承条件下的构造方法:
继承条件下构造方法的调用规则
- 子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法 ——> 系统默认调用父类的无参构造方法
- 子类构造方法通过super显式调用父类的有参构造方法 ——> 执行父类相应构造方法,而不执行父类无参构造方法
- 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。