面向对象三大特性:封装、继承、多态
一.封装
1、概念:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
2、好处:
只能通过规定的方法访问数据。
隐藏类的实例细节,方便修改和实现。
3、封装的实现步骤
需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。
get/set方法实例
public class Person {
//封装 private int Person;
/**
* 获取属性
* @return the age
*/ public int getAge() { return age;
}
/**
* 修改属性(进行数据校验,提高数据安全性和合理性)
* @param age the age to set
*/ public void setAge(int age) { if(age < 0) {
throw new InvalidParameterException("年龄不能小于0。"+age);
//弹出异常
} this.age = age;
}
}
访问修饰符
从表中可以看出封装的属性越来越弱
Java 中的内部类
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下:
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
内部类可分为以下几种:
1.成员内部类
public class Person {
//成员内部类,可以使用类的修饰符
public final class Test1{
}
protected class Test2{
}
class Test3{
}
private abstract class Test4{
}
}
2.静态内部类
public class Person {
//静态内部类
public final static class Test{
}
private abstract static class Test1{
}
}
3.局部内部类
public static long testCodeRunTime(Target target) {
//内部类(局部内部类)
abstract class Target2{
public abstract void code();
}
}
4.匿名内部类
//匿名内部类
Target target = new Target() {
//@Override
public void code() {
//执行代码
}
};
二、继承
1、继承的概念
继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:
注:java中的继承是单继承,即一个类只有一个父类。
2、继承的好处
子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用;
3、语法规则
只要在子类加上extends关键字继承相应的父类就可以了
//匿名内部类
public class Student extends Person{
//执行代码
}
方法的重写
子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
重写要注意:
a、返回值类型
b、方法名
c、参数类型及个数
都要与父类继承的方法相同,才叫方法的重写。
重载和重写的区别:
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
final关键字
使用final关键字做标识有“最终的”含义。
1. final 修饰类,则该类不允许被继承。
2. final 修饰方法,则该方法不允许被覆盖(重写)。
3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。
4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
Object类
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。
三、多态
面向对象的最后一个特性就是多态,那么什么是多态呢?多态就是对象的多种形态。
java里的多态主要表现在两个方面:
1.引用多态
必须具有关系(继承或者实现)
父类型引用指向子类型实例
Person p1 = new Student(); //p1 对象就是多态
Student s1 = new Student(); //s1 不是多态
Person p2 = new Person(); //p2 不是多态
2.方法多态
根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!
注意: 继承是多态的基础。
instanceof运算符
instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。
instanceof是Java的一个二元操作符,和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。