黑马程序员技术交流社区
标题:
分享我的总结(面向对象)
[打印本页]
作者:
Jam-l
时间:
2013-10-12 19:48
标题:
分享我的总结(面向对象)
考点:
一、面向对象:
1、概念:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。面向过程强调的是功能行为。面向对象:将功能封装进对象,强调具备了功能的对象。
2、什么是面向对象?、
答:是一种思想,是复杂的问题简单化,让角色从执行者变为指挥者。
3、举一个生活中的例子:
比如说这台电脑就是一个对象,它具备有视频功能,所以我现在就在使用这个电脑对象的视频功能。
4、面向对象的三个特征:封装,继承,多态。
(1)什么是封装?
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离,便于使用,提高重用性,提高安全性。
科普:函数是最小的封装体。
private关键字:私有,权限修饰符,用于修饰类中的成员(成员变量和成员函数)。被私有化的成员只在本类中有效。
常用方式之一:将成员变量私有化,对外提供对应的set和get方法对其进行访问,提高对数据访问的安全性。
(2)继承
继承是用exetends关键字来实现
1、让类与类之间产生了关系,有了这个关系,才有了多态的特征。
2、提高了代码的复用性。
注:千万不要为了获取其他类的功能简化代码而继承,必须类与类之间有所属关系才可以继承。
思想:将学生和工人的共性描述提取出来,单独进行描述。只要让学生和工人与单独描述的这个类有关系就可以了。
(3)多态
多态:可以理解为事物存在的多种体现形态。
好处:通过多态可以减少类中的代码量,可以提高代码的可扩展性和可维护性
实现多态:
1、继承的存在(继承是多态的基础,没有继承就没有多态)
2、子类必须重写父类的方法(因为通过父类的引用只能调用父类里面定义的方法)
3、子类到父类的转换称为向上转型,会自动进行类型转换,此时父类引用变量调用的方法是子类覆盖或者继承父类的方法,不是父类的方法。
4、父类到子类的转型称为向下转型,必须进行强制转换,此时可以调用子类的特有方法。
5、单例设计模式:解决一个类在内存中只存在一个对象。
单例模式目的:保证对象的唯一性。
1、为了避免其他程序过多建立该类对象。将构造函数私有化。
2、还为了让其他程序可以访问到该类对象,在类中创建一个本类对象。
3、为了方便其他程序对自定义对象的访问,提供一个方法可以获取到该类对象。
总结:之前是先初始化对象成为饿汉式,Single一进内存就已经建好了对象。而上面这个是方法被调用时,才初始化,就叫作对象的延时加载,又称为懒汉式。Single进入内存时,对象还没有存在,只有调用getInstance()方法时,才建立对象。
6、static(静态)关键字:用于修饰成员(成员变量和成员函数)。
static特点:
1、随着类的加载而加载。也就是说:静态会随着类的消失而消失,说明它的生命周期最长。
2、优先于对象存在。明确一点:静态是先存在,对象是后存在的。
3、被所有对象所共享。
4、可以直接被类名调用。
静态代码块:
特点:随着类的加载而执行,只执行一次,并优先于主函数。
作用:用于给类进行初始化。
7、什么时候定义静态变量(类变量)呢?
答:当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存储在堆内存中。
疑问神马时候定义静态函数呢?
答:当功能内部没有访问到非静态数据(对象的特有数据)时,那么该功能就可以定义成静态的。
8、覆盖于重载
重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法
重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型).
重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类.
9、接口特点:接口是不可以创建对象的,因为有抽象方法,需要被子类实现。子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。
接口与抽象类的区别:接口中都是抽象方法和常量,权限都是固定的。抽象类里可以存在非抽象方法。权限可以自己定。两者都需要子类去复写抽象方法才能实例化。
接口的优点:接口可以被类多实现,也是对多继承不支持的转换形式。
接口的特点:
1、接口是对外暴露的规则。
2、接口是出现的功能扩展。
3、接口可以用来多实现。
4、接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
5、接口与接口之间可以有继承关系。
10、abstract抽象类
抽象类应用:当多个类出现相同功能,但只是功能主体不同,这时可以进行向上抽取。这时只抽取功能定义,而不抽取功能主体。
抽象类特点:
1、抽象方法,一定在抽象类中。
2、抽象方法和抽象类都必须被abstract关键字修饰。
3、抽象类不可以用new创建对象。因为调用抽象方法没意义。
4、抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
11、内部类
内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类(内置类,嵌套类)。
访问特点:
内部类可以直接访问外部类中的成员。包括私有成员。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用。
引用格式: 外部类名.this.成员。
而外部类要访问内部类中的成员必须要建立内部类对象。
访问格式:
1、当内部类定义在外部类成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。格式:外部类名.内部类名.变量名 = 外部类对象.内部类对象();。Outer.Inner in = new Outer().new Inner();
2、当内部类在成员位置上,就可以被成员修饰符锁修饰,比如:private将内部类在外部类中进行封装。static让内部类具备static的特性
3、当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
当内部类定义在局部时:
1.不可以被成员修饰符修饰。
2.可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
12、多线程:
什么是进程?
进程是一个正在执行中的程序,每一个进程的执行,都有一个执行的顺序,该顺序就是一个执行路径,或者叫一个工作单元。
什么是线程?
线程就是进程中一个独立的控制单元,线程在控制着进程的执行,一个进程中至少有一个线程。
怎样实现多线程?
①. 继承Thread类
1、定义类继承Thread。
2、复写Thread类中的run()方法。目的:将自定义的代码存储在run方法中,让线程运行。
3、调用线程的start方法。该方法两个作用:启动线程;调用run方法。
②. 实现Runnable接口
1.定义类实现Runnable接口。
2.覆盖Runnable接口中的run()方法(将线程要运行的代码存放在该run()方法中)。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
5.调用Thread类的start()方法开启线程,并调用Runnable接口子类的run()方法。
继承Thread类和实现Runnable接口建立线程的区别?
1. 实现Runnable接口的方式,对象中的数据共享
2. 采用实现的方式使得类的扩展能力加强,除了可以继承其他类,还能实现多个接口。而采用继承的方式,再想继承别的类就不行了。避免了单继承的局限性。
①.同步代码块
同步的前提?
1.必须要有两个或者两个以上的线程。
2.必须是多个线程使用同一个锁。
3.必须保证同步中只能有一个线程在运行。
好处:解决了多线程的安全问题。
弊端:多个线程需要判断锁,较为消耗资源。
死锁问题:死锁通常发生在同步中嵌套同步。
②.sheep()和wait()的区别?
sleep()不会释放对象锁,有执行权,时间结束,自动恢复线程.
wait()对象释放锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
13、final关键字
final:最终,作为一个修饰符。
1、可以修饰类,函数,变量。
2、被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
3、被final修饰的方法不可以被复写。
4、被final修饰的变量是一个常量,既可以修饰成员变量,也可以修饰局部变量。
5、内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
什么时候用final修饰呢?
答:在描述事物时,一些数据的出现值是固定的,那么这时为了增加阅读性,都给这些值起个名字,方便于阅读,而这个值不需要改变。就可以加上final修饰。
扩展:模板方法设计模式。在定义功能时,功能的一部分是确定的,但是有一部分是不确定的。而确定的部分在使用不确定的部分,那么就将不确定的部分暴露出去,由该类的子类去完成。
作者:
bird_not_fat
时间:
2013-10-12 20:24
必须顶..给力!
作者:
Jam-l
时间:
2013-10-12 20:40
本帖最后由 Jam-l 于 2013-10-12 21:12 编辑
还有其他的,一次发不了那么多,- - !
作者:
枫儿
时间:
2013-10-12 21:12
给力啊!!!顶起~~~~~~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2