Java面向对象的三大特性是:
-
封装(Encapsulation):封装是将对象的属性(数据)和行为(方法)封装在一起,形成一个独立的、可复用的单元。通过封装,可以隐藏对象的内部实现细节,只提供对外的接口,提高代码的安全性和可维护性。封装还可以实现数据的访问控制,通过定义访问修饰符(如private、public等)来控制属性的可访问性。
-
继承(Inheritance):继承是指一个类可以派生出子类,子类继承了父类的属性和方法,同时可以扩展或修改这些属性和方法。通过继承,可以实现代码的复用,减少重复编写相同的代码。继承还可以形成类的层次结构,提供了多态性的基础,使得程序更加灵活和可扩展。
-
多态(Polymorphism):多态是指同一个方法在不同对象上具有不同的行为。通过多态,可以以统一的方式调用不同类的对象,提高代码的灵活性和可扩展性。多态可以通过继承和接口实现,通过重写(覆盖)父类的方法或实现接口的方法,在不同的子类中实现自己的行为。
这三个特性是面向对象编程的基础,它们共同支持了面向对象的抽象、封装、继承和多态等特性,使得Java程序设计更具灵活性、可维护性和可扩展性。
1.封装:私有化的作用?不私有化会怎么样?为什么要封装?封装有什么用?
私有化的表面意思就是属性的封装,如果不进行封装,则在测试代码中可以直接创造对象直接进行随意修改,不安全
而进行了封装的话,测试人就只能调用你提供的set,get方法来创建对象,而且你也可以在set,get方法中加入权限设置
2.继承
当创建子类对象时,先创建父类对象(默认调用父类中无参数构造函数),再创建子类对象;
* 父类对象一旦创建失败,子类无法创建成功。
* 在子类中调用父类带参数的构造函数,如何做呢? 引入super关键字的
* 第二种用法:父类构造函数 super(实参);
* super(实参)调用父类构造函数,只能到子类的构造函数的第一行代码位置使用
*
* super关键字的第一种用法:指向当前对象的父类对象 在子类中调用父类中的方法 super关键字 super.父类成员方法
* this:指向当前对象
* this(实参) 调用构造函数
* 父亲有的方法,子类也有会将其覆盖,父类有的方法,子类没有则不能调
* 注意:this(实参) super(实参)是不能同时出现在同一个构造函数中
*/
3.多态之一:
方法的重载:一个类中可以有多个方法具体相同的方法名,但是这些方法的参数必须不同的。
* 相同点:方法名相同
* 不同点:
* 参数不同:
* 参数个数不同
* 参数类型不同
* 参数类型顺序不同
*
*注意:与返回值无关;与访问权限无关,必须在同一作用域中--(同一个类中方法)
“向上转型”。
我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。
但当我这样定义时: Animal a = new Cat();
表示定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。
那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。