1.封装
封装的定义:
首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系
为什么需要封装:
封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现
举例:
public class Human
{
private int age;
private String name;
public int getAge()
{
return age;
}
public void setAge( int age ) throws Exception
{
//封装age的检验逻辑,而不是暴露给每个调用者去处理
if( age > 120 )
{
throw new Exception( "Invalid value of age" );
}
this.age = age;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
}
2. 继承
Java的类可以分为三类:
类:使用class定义,没有抽象方法
抽象类:使用abstract class定义,可以有也可以没有抽象方法
接口:使用inerface定义,只能有抽象方法
在这三个类型之间存在如下关系:
类可以extends:类、抽象类(必须实现所有抽象方法),但只能extends一个,可以implements多个接口(必须实现所有接口方法)
抽象类可以extends:类,抽象类(可全部、部分、或者完全不实现父类抽象方法),可以implements多个接口(可全部、部分、或者完全不实现接口方法)
接口只能extends一个接口
继承以后子类可以得到什么:
子类拥有父类非private的属性和方法
子类可以添加自己的方法和属性,即对父类进行扩展
子类可以重新定义父类的方法,即多态里面的覆盖,后面会详述
关于构造函数:
构造函数不能被继承,子类可以通过super()显示调用父类的构造函数
创建子类时,编译器会自动调用父类的 无参构造函数
如果父类没有定义无参构造函数,子类必须在构造函数的第一行代码使用super()显示调用
类默认拥有无参构造函数,如果定义了其他有参构造函数,则无参函数失效,所以父类没有定义无参构造函数,不是指父类没有写无参构造函数。看下面的例子,父类为Human,子类为Programmer。
public class Huma