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

来源:互联网 发布:视频播放器 2017 知乎 编辑:程序博客网 时间:2024/04/27 13:36

------- 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培训、期待与您交流! ----------


原创粉丝点击