面向对象三个特性:继承(Inheritence)、封装(Encapsulation)、多态(Polymorphism).
1、封装(Encapsulation):
类包含了数据与方法,将数据与方法放在一个类中就构成了封装(一般来说,将属性私有化,并且生成setter和getter方法)。它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供方法来实现对内部信息的操作和访问。把隐藏的东西隐藏,将该暴露的东西暴露.一般是通过访问控制符完成封装。
Java中的访问权限控制符有四个. 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 没有时默认为friendly,如构造函数等~在Java语言中有4种访问修饰符:package(默认)、private、public和protected.1。package是默认的保护模式,又叫做包访问,没有任何修饰符时就采用这种保护模式。包访问允许域和方法被同一个包内任何类的任何方法访问。(包内访问)2。private标识的访问模式,表示私有的域和方法只能被同一个类中的其他方法访问,实现了数据隐藏;必要时,可以通过方法访问私有变量。(类内访问)3。public修饰符用于暴露域和方法,以便在类定义的包外部能访问它们。对包和类中必要的接口元素,也需要使用这个级别;main()方法必须是public的,toString()方法也必须是public的。一般不会用public暴露一个域,除非这个域已经被声明为final。(跨包访问)4。protected修饰符提供一个从包外部访问包(有限制)的方法。在域和方法前增加protected修饰符不会影响同一个包内其他类和方法对它们的访问。要从包外部访问包(其中含有protected成员的类),必须保证被访问的类是带有protected成员类的子类。也就是说,希望包中的一个类被包之外的类继承重用时,就可以使用这个级别。一般应该慎用。(包中类被包外类继承重用)
1.1、对象在堆中的分配:
new关键字所做的工作:
① 为对象开辟内存空间② 调用类的构造方法③ 将生成的对象的地址返回
方法与属性的分配:
如果一个类包含了属性和方法,那么该类的每一个对象都有自己的属性,但是无论有多少个对象,这些对象共享一个方法。
1.2、封装中的构造方法(重载):
重载:
构造方法重载时,只需看参数即可。
使用this():
在一个构造方法中调用另外一个构造方法,可以使用this(),this()中的参数根据调用的构造函数确定。this()语句必须作为构造方法的第一条语句
2、继承(Inheritence):
Java是单继承的,意味着一个类只能继承一个父类,使用extends关键字。
2.1、继承中的构造方法:
继承关系中构造方法的调用:
生成子类对象时,Java默认地首先调用父类的不带参数的构造方法,并执行该构造方法,生成父类的对象。接下来才是调用子类的构造方法,生成子类的对象。(即是想要生成子类对象,必须先生成父类的对象,没有父类的对象就没有子类的对象)
package com.blog;/** *基类 */class SuperTest { private String age; public SuperTest(String age) { this.age = age; System.out.println(this.age); } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}/** *导出类 */public class Test extends SuperTest{ private String name; public Test(String age,String name) { super(age); //调用基类的构造方法. this.name = name; System.out.println(this.name); } public static void main(String[] args) { Test test = new Test("50", "itcast"); }}//output:50 itcast ~~//
使用super关键字:
super表示对父类对象的引用。
使用了super显示的调用父类的某个构造方法后,那么在执行的时候就寻找super()对应的构造方法而不再寻找父类的不带参数的构造方法。super必须作为构造方法的第一条执行语句。
2.2、继承中父类与子类的关系:
① 父类有的,子类也有② 父类没有的,子类可以有③ 父类有的,子类可以改变
2.3、继承中需要注意的:
① 构造方法不能被继承② 方法和属性可以被继承③ 子类的构造方法隐式地调用父类的无参构造方法,即java.lang.Object是被默认继承的.④ 当父类没有不带参数的构造方法时,子类需要使用super关键字来显示调用父类的构造方法。super指的是父类的引用⑤ super关键字必须是构造方法中的第一句。
2.4、继承中的方法重写:
当两个方法形成重写关系时,可以在子类中通过super关键字调用父类被重写的方法。此时的super关键字不必放在第一句,而是根据逻辑决定。
3、多态(Polymorphism):
多态指的是父类型的引用可以指向子类的对象。(苹果是水果,足球是球).Java中的引用变量有两种, 一种是编译时类型由声明该变量时使用的类型决定,还有一种是运行期类型由实际赋给变量的对象决定.如果编译时和运行时类型不一致,就会出现多态.
Parent p = new Child();
p.execute();
3.1、使用多态调用方法:
当使用多态调用方法时,首先检查父类中是否有被调用的方法,如果没有则编译出错;如果有,再去调用子类的方法。
3.2、多态中的两种类型转换:
① 向上类型转换(upcast):将子类型转换成父类型。对于向上类型转换,不需要显示指定:
Parent p = new Child();
② 向下类型转换(downcast):将父类型转换为子类型。对于向下类型转换,必须要显示指定,使用强制类型转换:
Parent p = new Child();
Child child = (Child)p;
以下的编译不会出错,运行时很有能报错(ClassCastException):
Parent p = new Parent();
Child child = (Child)p;
如果用instaceof判断一下是否属于类或者子类的一个实例.
if(child instaceof Parent){
Child child = (Child)p;
}
4、继承和组合:
继承是实现类重用的重要手段,但是它会带来一个大的坏处:破环封装.相比之下,组合也是实现类重用的方式.而采用组合方式能够更好的提供类的封装.
5、Java初始化顺序
ps:Java中面向对象思想其实不难理解,但是有的时候又非常让人头疼.我只是总结一点常用的知识点.其实还有很多自己到现在还搞不明白.计算机将现实中的东西抽象出来的思维.自己理解的还不够透彻....
----------------------- 、、java学习型技术博客、期待与您交流! ----------------------
详情请查看: