目录
1.三大特性
1.1封装
封装的定义:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
封装的特点:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现。
封装的步骤:
我们首先了解一下访问修饰符的概念,在Java中访问修饰符是用来设置类、变量以及方法的访问权限的,不同的访问修饰符所设置的权限不一样,下面的表格给出了Java的4种访问修饰符的权限:
了解访问修饰符的权限后,我们通过下面的代码来具体了解封装的步骤:
public class Student{
//1.使用private访问修饰符定义变量
private String name;
private int age;
//2.创建get/set方法
public String getName(){
return name=name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age=age;
}
public void setAge(int age){
this.age=age;
}
//3.加入属性控制
public void setAge(int age){
if(age<0){
this.age=20;
} else{
this.age=age;
}
}
}
在面向对象编程过程中,为了更好地实现封装特性,我们引入“内部类”这一概念。内部类就是定义在另外一个类里面的类,包含内部类的类被称为外部类。内部类的主要作用有:1.提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。内部类主要有以下四种:
1.成员内部类
成员内部类时最常见的内部类,又称为普通内部类。
从上面的代码我们可以知道使用成员内部类需要注意以下几点:
1)、 Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等;
2)、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a;
3)、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( )。
2.静态内部类
静态内部类是 static 修饰的内部类,这种内部类的特点是:
1)、静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问。
2)、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员。
3)、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
3.方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
4.匿名内部类
匿名类是不能有名称的类,所以没办法引用他们。必须在创建时,作为new语句的一部分来声明他们。使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。
如要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能 是所需的类过于简单,或是由于他只在一个方法内部使用),匿名类就显得很有用。以下是一个匿名内部类的实例:
1)、匿名内部类的基本实现:
可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写,并且,匿名内部类还能用于接口上。
2)、在接口上使用匿名内部类:
在使用匿名内部类的过程中,我们需要注意如下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口;
2、匿名内部类中是不能定义构造函数的;
3、匿名内部类中不能存在任何的静态成员变量和静态方法;
4、匿名内部类为局部内部类(即方法内部类),所以局部内部类的所有限制同样对匿名内部类生效;
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
1.2继承
继承的概念:所谓继承就是子类继承父类,子类可以继承父类定义的所有属性和方法(访问修饰符private修饰的属性除外)。
继承的好处:代码复用,避免重复定义相同属性和方法。示例如下:
public class Student{
String name;
private int age;//不能被子类继承的变量
int score;
public void study(int hour){
System.out.println("学习了"+hour+"个小时");
}
}
//子类完全继承父类的属性和方法
public College extends Student{
}
public static void main(String[] args){
Student A=new College();
College.study(4);
}
关于继承需要注意以下几点:
1.Java中的继承只能单继承,即一个子类只能有一个父类;
2.子类可以重写父类的方法,重写时需要保证方法名一致,方法体可以不一致。子类方法调用时优先调用子类中的方法,如果子类没有重写则调用父类的方法;
3.子类可以定义属于自己方法,但子类调用该方法时不能使用自动转型,如上面的例子,Student A=new College();就不能实现。
1.3多态
多态的概念:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
多态存在的三个必要条件:1.继承;2.重写;3.转型。
关于多态可以通过以下的例子来理解:
public class Student{
String name;
private int age;//不能被子类继承的变量
int score;
public void study(int hour){
System.out.println("学习了"+hour+"个小时");
}
}
//子类完全继承父类的属性和方法
public College extends Student{
public void study(int hour){
System.out.println("学习了"+hour*6+"个小时");
}
public Primary extends Student{
public void study(int hour){
System.out.println("学习了"+hour*2+"个小时");
}
}
public static void main(String[] args){
Student A=new Student();
Student A=new College();
Student A=new Primary();
College.study(4);
Primart.study(2);
}
在上面的案例中,我们可以看到通过Student这个父类可以引用到其本身以及两个子类,这就是引用对象的多态。而在调用方法时,子类没有重写方法时可以调用父类的方法,子类重写了自己的方法则调用的是子类重写的方法,这就是方法的多态。
2.五大原则
2.1 SRP
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
2.2 OCP
开放封闭原则(Open-Closed principle):对扩展是开放的,对更改是封闭的!扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!
2.3 LSP
里式替换原则(Liskov-Substituion Principle):子类可以替换父类并且出现在父类能够出现的任何地方。这一思想体现为对继承机制的约束规范,只有子类能够替换父类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
2.4 DIP
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
2.5 ISP
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口。