面向对象的三大特性:封装、继承与多态。
封装:强调的是保护与易用
定义:对外屏蔽类内部的一些实现细节或属性,类的外部只能通过类提供的方法来操作类。
例子:自动挡汽车的自动挡就是一种封装,手动档汽车必须挂档等等操作,而在自动档里,档位封装了,不需要再明白怎么挂档,直接启动就可以了。
如何实现封装?
通过类结构以及访问修饰符来实现封装。访问修饰符的作用就是控制方法与属性只对哪些类可见。
四大访问修饰符:
private(私有权限,类内部可见)< default(包访问权限,包内部可见)< protected (继承权限)< public (公开权限,所有对象可见)
一、 private访问修饰符
private 修饰属性,成为私有属性,仅在当前类内部可见。(使用private对属性进行封装操作)
当属性被private封装后,类中需要提供getter与setter方法来控制私有属性,在该类外部时通过
getter 来取得私有属性
setter 来修改私有属性
上图是打印创立的getcardname与getbalance两个方法的语句,我们只看getbalance,通过card这个类创建一个新对象,在这个新对象里调用类中的刚创立好的getbalance方法,这样就完成了通过特定方法在类外部取得私有属性的操作。如果没有设立get方法,那么外部是无论如何也无法访问到private对象的,设立后,就为调用private属性设立了一个条件,满足才会执行,下图是getbalance具体代码。
特别的
二、包访问权限default(不需要在实际操作时把default写上,这是默认的)
什么是包?包就是文件夹。在操作系统中,同一个文件夹内不能存在同名文件(同名称同类型)。
java中使用package声明一个包,就是一个文件夹,来解决类名称重复的问题。
包的命名:全小写,多个单词之间用 - 分隔。
java中产生一个包就在操作系统中对应产生一个文件夹。
若多个包下都存在同名的类,例如文件夹1里面有文件夹2和小笼包.java,文件夹2里又有文件夹3和小笼包.java,文件夹3里又有小笼包.java,那么此时,使用important关键字引入某个包下的某个类,相当于精准定位一个文件。在操作系统中,文件的全路径为文件绝对路径+文件名。
而类的全名称为:包名.类名。
如果我们使用同一个包下的许多类
我们可以使用通配符
但是如果都是用通配符
有可能产生这种情况,解决方法有两种
还有一个静态导入
其实在我看来静态导入和未导入的区别无非就是不用写前缀了。 (上图中Math被省略)
继承:代码复用,增加整个程序的扩展性
父类中的属性是子类共有的,构造子类时,会先自动构造父类。 默认先调用父类的构造方法,然后再用子类的构造方法,构造完成。
语法
父类和子类的成员关系:
1 不存在同名属性和方法
上图中父类成员属性为 int a 与 int b,而子类只有 int c
2 若存在同名属性和方法,则编译器的就近匹配原则会使用,先匹配子类的,没有再匹配父类的。
隐式继承:父类中存在private私有域时,子类在继承时,私有域是无法被使用的,这种继承就叫隐式继承。就相当于父类给了子类一张纸,上面打满了马赛克,虽然子类得到了,但是你看不到纸上写的究竟是啥。
父类和子类之间方法的调用:
和属性一样,优先匹配子类的方法,再匹配父类的,不过方法匹配要注意的是,方法需要注意方法名与参数,两者都匹配才能匹配。
super关键字:表示直接从父类中寻找成员变量或成员方法。上文中我们说编译器会就近匹配原则,而使用super就可以打破就近匹配原则。
super修饰成员属性,则直接寻找父类的成员属性
super修饰普通成员方法,直接在父类中寻找同名方法。
super修饰构造方法,表示显示在子类中调用父类的构造方法。
上文中说到,构造子类之前一定会先构造父类,如果父类中是无参构造,那么不需要写super语句来调用,如果不是,那么必须写上才能正常产生对象,且必须写在首行。
而当在使用父类继承时,一般不会调用this语句调用,因为this的调用也是要放在第一行的。