面向对象中的几个重要知识点和概念:封装,构造函数,Static关键字,继承(抽象类,接口)。
(1),封装,是指将将对象自己的属性和细节隐藏起来,仅仅对外提供公共访问方式.
封装的优点:
(1):提高安全性;
(2),提高了重用性 ;
(3),封装后作为一个整体便于使用 ;
(4),将数据变化隔离。
自己的理解:我认为封装就是将同类事物的各个属性和操作方法打包成为一个整体,然后根据自己的安全需要,对内部的属性和方法规定一个访问权限,外部其他事物根据其权限进行调用,既保证了自己的完整性,也提高了访问的安全性。
2,构造函数,是每个类中与类名相同,没有返回值类型,用来给对象初始化的一个方法。
特点:每个类都有自己默认的构造函数,当写了多个构造函数的时候,是以重载的方式存在。例如下面类
class Person{
Person(){}//空构造函数
Person(int a,int b){}//接收两个参数的构造函数
}
自己的理解:构造函数的出现是为了方便调用者或者引用者通过不同的参数类型和个数的传递来分别调用不同的构造函数从而实现同类中不同的具体功能实现,构造函数也可以实现初始化。
3,Static 关键字,是一个静态修饰符,用于修饰成员变量和成员函数。当成员被静态修饰后,可以被类名直接调用。
特点:Static修饰的成员随着内存的加载而加载,随着类的消失而消失,伴随整个过程。
优点:(1)优先于对象的存在;(2)被所有对象共享;(3)可以直接被类名调用。
缺点:(1)生命周期太长,占用内存,所以不能过多的定义Static成员,要根据实际情况来合理使用。
(2)但是静态方法中不可以定义this,super,而且静态方法只能访问静态成员
例如main()方法
public static void main(String[] args) {}
也被定义为Static ,就是用到了其优点,首先被内存加载。
自己理解:Static 修饰符具有优先加载,存在周期长,可以实现所有对象共享的优点,但也有占内存等缺点,需要在适当的情况下使用,而不是一概而论的使用。
注意:在多态中,静态方法无论编译还是运行,都看左边。
4,继承(抽象类,接口 ),
继承,继承是使用已存在的类的定义作为基础建立其子类,子类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
继承的优点:(1)提高了代码的复用性,简化代码;(2)让类之间产生关系,也才有后来出现的多态特性。
局限性:Java语言中,支持单继承,不支持多继承,多继承容易带来安全隐患(当多个父类定义了相同的方法,不确定子类对象要运行哪一个),但是Java支持多层继承(见如下代码 A,B,C类为多层继承),而且Java有接口的出现,弥补了不能多继承的的局限性。
class A{
}
class B{
}
class C extends A,B{
}
抽象类:abstract
是当多个类中出现相同的功能,但是主体方法不一样,于是可以向上抽取,可以定义一个抽象类,在该类中定义那个相同的功能的方法,而不定义该类的主体,以便其他类对该类中那个为实现相同功能的抽象方法的调用和实现,抽象类中可以定义抽像方法也可以定义非抽象方法。
抽象类的特点:
(1)抽象方法一定在抽象类中;
(2),抽象类和抽象方法都必须被abstract关键字修饰;
(3),抽象类不可以用new 创建对象,无意义;
(4)抽象类中的方法要被使用,必须由子类复写其中的抽象方法后,建立子类对象进行调用,也就是必须实现其中的调用的抽象方法。
(5)如果调用抽象类的子类中只覆盖了一部分抽象方法,那么子类也是一个抽象类。
抽象类实例如下
abstract class Father {
abstract void eat();
abstract void sleep();
}
//此子类只调用了抽象类的一个方法所以依旧为抽象类,必须带上abstract,否则就要对另外的方法空实现
abstract class Son extends Father {
void eat() {
System.out.println();
}
}
//该子类中完全实现覆盖了抽象类中的方法,所以不需要加abstract
class Son2 extends Father {
void eat() {
System.out.println();
}
//此处sleep() 方法为空实现
void sleep() {}
}
接口:interface
接口是其中包含若干抽象方法的声明,接口中只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的功能。可以理解为接口为抽象类中的方法全部为抽象方法的抽象类。
特点:(1)格式,内容包括常量,抽象方法。其成员都有固定的修饰符,常量(全局):public Static final;方法:public abstract
代码格式
interface Inter
{
// 下行代码用 int num=0;也可以,系统会自动识别
public static final int num=0;
// 下行代码用 void learn();也可以,系统会自动识别
public abstract void learn();
}
(2)同抽象类一样,不可以new对象;
(3)在子类调用接口的时候,子类需要对接口中的所有方法全部覆盖,子类才可以实例化,如果子类只需要实例化其中一部分方法,那么接口中的其他方法可以空实现,否则子类就必须为抽象类。
(3)接口可以被类多实现(扭转了Java语言不支持多继承的缺点);
(4)接口是对外暴露,提高了程序的功能拓展,降低了偶合性。
自我学习心得:在之前没有学习黑马自学视频之前,在校期间我们开C++课程的时候,自认为老师讲的面向对象思想很好,也觉得自己对面向对象的思想的理解算是明白了,但是在看了黑马视频之后的自学中,我感觉到自己要学的东西还很多,自己对面向对象思想的理解,并没有十分深刻,有一颗浮躁的心 ,我决定沉下去好好学习更深的东西,学无止境,我通过这段学习,让自己对面向对象的思想更好的理解,对其基本的知识有了更加巩固和提高。