您的位置:首页 > 编程语言 > Java开发

JavaSE基础复习二:面向对象知识点

2012-12-02 10:39 253 查看
------- android培训java培训、期待与您交流! ----------

1、函数重载overload

    同一个类中,函数名相同但是参数列表不同(参数个数或者参数类型),构成重载。

    重载和函数的返回值类型无关。

    即:如果参数列表相同,仅仅返回值类型不同,则不允许出现在同一个类中,编译时会出错。

长度可变参数情况的重载

2、内存划分:

    heap 堆内存   :存储new出来的东西,对象,数组,被初始化值

    stack 栈内存  :存储局部变量,引用;作用域和生命周期结束,内存自动释放

    datasegment   :存储字符串常量和静态变量

    codesegment   :存储代码
 

面向对象是一种思想,举例    名词提炼法

面向对象三个特张:封装,继承,多态

3、封装(Encapsulation):隐藏对象的属性和实现细节,仅对外提供公共访问方式

    好处:将变化隔离;便于使用;提高重用性;提高安全性

    原则:将不需要对外提供的内容隐藏起来;把属性隐藏,提供公共方法供外部访问。

    

             public    protected    default    private

同一类        ok        ok            ok        ok

同一包        ok        ok            ok        

子类          ok        ok    

不同包        ok

4、面向对象编程应考虑的问题:

    1、有哪些类和对象  

    2、类和对象应有的属性和方法  

    3、类与类、类与对象之间的关系(关联、继承、聚合、多态、实现)

聚集关系:has a  按照事物的紧密联系程度

    组合:手、心脏

    聚合:球队、球员

继承关系:父子关系    

5、类  :

    数据和对数据操作的集合,是对事物的描述;

    包括:属性(又叫成员变量)和成员方法

对象:类的实例,new出来的东西

5.1、成员变量和局部变量:

    1、成员变量作用域整个类中;                         局部变量作用域为函数体或者语句中。

    2、成员变量存在于堆内存中;                         局部变量存在于栈内存中。

    3、成员变量随对象的创建而创建,随对象的消失而消失; 局部变量只在作用域内存在,作用域结束消失。

    4、成员变量默认有初始化值;                         局部变量需要手动初始化。

    

5.2、构造函数:

    构建创建对象时调用的函数,作用是对对象进行初始化

    和类名一样,不能有返回值类型,不能有return语句。

    

    1、对象一建立就会调用与之对应的构造函数,用于对对象初始化

    2、如没有定义构造函数,系统内有默认的空参数的构造函数;当自定义构造函数后,默认构造函数消失;

    3、构造函数和一般函数在写法上和运行上有不同; 

       一个对象被创建时只调用一次构造函数;一般函数可被多次调用,并且只在需要时才调用;

       构造函数内部可以调用一般函数。

    4、构造函数可以有多个,用以对对象进行针对性的初始化,以重载的方式体现(参数列表不同);

    5、构造函数前面如果加了void则成为一般函数。

    6、构造函数可以被私有化,但如果被私有化就不可在外界创建对象时访问该构造函数。

默认的无参构造函数,如果该类被public修饰,则该构造函数也是共有的。

javadoc的使用方法.

5.3、Java中的代码块

构造代码块:( 一个没有名字的代码块 )  {。。。} 大括号内即为构造代码块。

    给对象进行初始化。

    对象建立时运行,并且优先于构造函数运行。定义共性初始化内容。

    

构造代码块是给所有对象统一初始化,构造函数是给对应的对象初始化。

静态代码块。 (static 修饰的无名代码块)

随着类的加载而执行。而且只执行一次。 如果类中有主函数,优先于主函数执行。

静态代码块只能访问静态成员。

作用:用于给类进行初始化。

先执行静态代码块,先显式初始化,使用构造函数时,先执行构造代码块,在执行构造函数。

静态代码块给类初始化,构造代码块给对象初始化,构造函数给指定对象初始化。

分析 Person p = new Person();的执行过程

1、加载Person.class 文件,进入codeSegment

2、加载静态代码块

3、在堆内存中开辟空间,分配内存地址

4、在堆内存中建立对象的特有属性,并进行默认初始化

5、对属性进行显示初始化(属性的默认初始化赋值)

6、对对象进行构造代码块初始化

7、对对象进行对应的构造函数初始化

8、将内存地址赋给栈内存中的变量。

5.4、匿名对象:

    new出来不起名字,则是匿名对象    

匿名对象的使用方式:

    1、当匿名对象的方法只调用一次,则可以用匿名对象。

    2、匿名对象可以作为实际参数传递。

    

凡是简化的必定有局限性:

    比如:三目运算符是if else 语句的简化,但是三目运算必须有运算值,并且语句只有一个。

    匿名对象的方法只能被调用一次。

5.5、this关键字:

    代表所在函数所属对象的引用。super关键字是对父类的引用。

this应用:

    区分局部变量和成员变量同名的情况。

    当定义类中的功能时,函数内部要用到调用该函数的对象时,用this代表这个对象。

    但凡本类功能内部使用到了本类对象,都用this表示。

构造函数之间有重复的内容或者功能,不能像一般函数一样调用,需要使用this,this代表对象。    

this语句用于构造函数之间互相调用。

this语句必须是构造函数的第一个语句,因为初始化动作要先执行,初始化动作中还有初始化动作时。    

5.6、static 关键字:

成员变量和静态变量的区别? 

1,两个变量的生命周期不同。 

    成员变量随着对象的创建而存在,随着对象的被回收而释放。 

    静态变量随着类的加载而存在,随着类的消失而消失。 

2,调用方式不同。 

    成员变量只能被对象调用。 

    静态变量可以被对象和类名调用。 

3,别名不同。 

    成员变量也称为实例变量。 

    静态变量称为类变量。  

4,数据存储位置不同。 

    成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据. 

    静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据. 

静态使用的注意事项: 

1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态) 

2,静态方法中不可以使用this或者super关键字。静态优先于对象而存在。 

3,主函数是静态的。 

静态什么时候用? 

1,静态变量。 

    当分析对象中所具备的成员变量的值都是相同的 。 

    这时这个成员就可以被静态修饰。 

    只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。 

    如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。 

 

2,静态函数。 

    函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。 

    简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。 

    如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态, 

    但是非静态需要被对象调用,而仅创 

5.7、工具类:

    没有特有数据,都是静态方法。

    抽取一个应用程序中共有的功能,增强复用性,类中的方法都是静态方法,封装成一个工具类。

    并且将无参构造函数私有化。因为该类创建对象没有意义。

工具类静态导入  impport static

6、继承:

java中的类只能单继承,但可以多实现,支持多重继承。

继承体系,查阅父类功能,创建子类实例。

java中的接口可以多继承。

实现接口的方法必须是public,因为接口的方法默认为public

6.1、覆盖(重写override):

    当子父类中成员函数一模一样,会运行子类的函数。

    覆盖注意事项: 

1, 子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。  

2, 静态只能覆盖静态,或被静态覆盖。

3、 子父类方法要一摸一样

重载是同一个类中看参数列表是否相同。

覆盖是子父类方法要一模一样。

6.2、覆盖原则:两同两小一大

    两同:函数名,参数列表相同

    两小:子类返回值类型、子类抛出的异常要比父类小

    一大:子类方法的访问权限比父类方法大

什么时候使用覆盖操作? 

当对一个类进行子类的扩展时,子类需要保留父类的功能声明, 

但是要定义子类中该功能的特有内容时,就使用覆盖操作完成. 

1、子类在覆盖父类方法时,父类的方法如果抛出了异常, 

   那么子类的方法只能抛出父类的异常或者该异常的子类。 

2、如果父类抛出多个异常,那么子类只能抛出父类异常的子集。 

   子类覆盖父类只能抛出父类的异常的子类或者子集。  

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try . 

super关键字,可以引用父类中的成员,在子类中访问父类被隐藏的成员。

6.3、继承中构造函数的用法:

子类中的构造函数默认调用父类无参构造函数,

父类构造函数必须在第一行,super();如果有this() 不能有super()

6.4、final关键字:

被final修饰的变量不能修改,作为常量大写,多个单词之间用  _  隔开;

被final修饰的类不能被继承,被final修饰的方法不能被重写

abstract关键字:抽象类和抽象方法。

7、多态:

    事物可以存在多种形态,父类引用指向子类对象(父类和子类存在覆盖或者实现)。

    提高了扩展性,只能使用父类引用访问父类中存在的成员。

    父类引用指向子类对象后,子类被提升,向上转型;

    如果需要使用子类特有成员,需要向下转型,对父类引用强制类型转换。但不可将父类对象转成子类。

7.1、多态时,成员的特点: 静态绑定 动态绑定

 

Base base = new Sub();

静态绑定:对于静态成员,绑定到类上

动态绑定:非静态成员,this引用指向不固定

1,当base调用成员变量。 

    编译时:先看Base类中的是否有调用的成员变量,有,编译通过,没有,编译失败。 

    运行时:先看Base类中的是否有调用的成员变量,并调用Base类中的成员变量。

    简单说:编译和运行成员变量的值取决于等号的左边。 

 

2,成员函数(非静态)。 

    编译时:先看Base类中的是否有调用的函数。有,编译通过,没有,编译失败。 

    运行时:运行子类中的函数。 

    简单说:编译看左边,运行看右边。 

    因为成员函数存在覆盖特性。 

 

3,静态函数。 

    编译时:看Base类中的是否有调用的静态方法。 

    运行时:运行Base中的静态方法。 

    简单说,编译和运行都看左边。 
    其实对于静态方法,是不需要对象的。应该直接用类名调用,静态绑定。 

------- android培训java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息