黑马程序员-Java基础总结04——面向对象

面向对象

-------android培训java培训、期待与您交流!----------

内容: 面向对象(匿名对象)、static代码块、构造代码块与构造函数、单例设计模式。

面向过程:强调的是功能行为。

面向对象:相对于面向过程而言,它将功能封装进对象,强调具备了功能的对象。

 

1开发的过程:其实就是不断的创建对象使用对象指挥对象做事情。

设计的过程:其实就是在管理和维护对象之间的关系

面向对象的三个特征:

封装(Encapsulation)

继承(inheritance)

多态(polymorphism)

 

2类与对象的关系

Java中描述事物通过类的形式体现,即称之为面向对象

是具体事物的抽象,概念上的定义。

对象即是该类事物实实在在存在的个体,即类所描述的实体

(对象是汽车,则类是生产汽车的图纸,注明了对象的属性与行为(功能)。)

例:  汽车(生活中统称的所有汽车)可以看着 Car 这个Java类;

       生产一辆名为法拉利ferrari的汽车: Car ferrari = new Car();       

       //ferrari是这辆车的名字,而new Car()相当于根据图纸Car生产出来的汽车。


3Java中用class描述事物的属性与行为

属性:对应类中的成员变量

行为:对应类中的成员函数

定义类:  其实就是在定义类中的成员(成员变量和成员函数)


PS类的类体是由两部分组成:变量的定义和函数(方法)的定义

而它们都各自包含两个部分:   变量:变量声明、变量初始化;   例: int i = 86;

方法: 方法声明(包括方法名、方法的返回类型和方法的参数)以及方法体的内容。   

    例: public static int getAge(String name){ ...... }  

【类的大括号中的内容叫做类体;而方法的大括号中的内容叫做方法体。】

 

4、成员变量与局部变量的区别

成员变量

成员变量定义在类中,在整个类中都可以被访问;

成员变量随着对象的建立而建立,存在于对象所在的堆内存中;

成员变量有默认初始化值

局部变量

局部变量只定义在局部范围内,如:函数内,语句(for)内等;

局部变量存在于栈内存中;

作用的范围结束,变量空间会自动释放;

局部变量没有默认初始化值,不初始化不能参与运算。

 

5匿名对象:是对象的简化形式,有两种使用情况:

1、当对象方法仅调用一次时:

例如:[ Car c = new Car( );      c.run( );    c.num = 4;]

        匿名对象:new Car().run( ); 

匿名对象仅调用对象方法;调用属性修改都是重新生成,没有指定目标即无法再此被使用】

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

例:  [Car c = new Car( ) ;    方法show(c) ;  ]

      匿名形式为:show (new Car( ));      (适用于仅需一次性使用)

因为匿名对象——>直接将实际参数导入,生命周期短,使用完即在内存中被清除

 

引用数据在缓存区中所需的生命周期:           (优化内存)

      就要考虑:强引用、弱引用、软引用、虚引用

 

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

好处:a、将变化隔离;b、便于使用;

 c、提高重(/)用性;d、提高安全性。

封装原则:

A、将不需要对外提供的内容隐藏(方法实现细节等);

B、把属性都隐藏(权限修饰符限制访问),提供公共方法对其访问

      [PS:函数是Java中最小的封装体]

 

7静态代码块:  1给类进行初始化,优先于主函数执行;

 2、当类被调用时,随类的加载而加载只执行一次

   格式:       static     /n{       类初始化的内容;     }  (/n: 换行)

构造代码块:    给类中所有对象进行统一初始化,优先于构造函数执行,只执行一次

(而构造函数是给不同对象进行不同的初始化。)

构造代码块格式: {  该类中所有对象的共性的初始化内容  } 

构造函数:  类名(参数类型,……){ 不同对象的不同初始化内容 }

 

8、函数执行顺序:  (当类中对象被调用时)

静态代码块——>构造代码块———>构造函数——>一般函数(调用才执行)

(类初始化)   (所有对象初始化)   (对应对象初始化)  (对象的功能调用)


PS: 同一个对象中,前三者都只运行一次,而一般函数可重复调用。

不同点 

1静态代码块只出现一次(因为类的加载只需执行一次);

构造代码块与构造函数虽然也只运行一次,但是可重复出现,不过是在属于(创建)不同的对象。

2、调用局限性:静态代码块属于静态类型,所以不能调用非静态成员

               而构造代码块和构造函数可调用静态和非静态成员。

 

分析:   (详见Java基础视频教程第06天之对象初始化过程)

Person p = new Person("zhangsan",20);

该句话都做了什么事情?

1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。

2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。

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

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

5对属性进行显示初始化

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

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

8,将内存地址付给栈内存中的p变量。

 

9构造函数

特点:   1函数名与类名相同

2、没有具体的返回类型,也就没有返回值(return)

3不可以定义返回值类型void

4不能被直接调用,必须通过new运算符创建对象时才会自动调用;

作用: 给对象进行初始化

注意:   1、默认构造函数的特点(没有创建构造函数时,系统默认创建无参数构造函数);

2、多个构造函数是以重载的形式存在的,根据不同情况调用不同的构造函数。

构造函数与一般函数的区别:

   构造函数一建立就给对象初始化,且同一构造函数只运行一次(重复调用同一构造函数,也只是在重新创建对象)

   一般函数(方法)只有在对象调用时才执行,是给对象添加对象具备的功能,且重复调用

 

什么时候使用构造函数?

1、当分析事物,该事物一存在就具备一些特性或者行为,那么就将这些内容定义在构造函数中(即带参数的构造函数)

2、通常要调用该类的非静态方法时,需要通过新建(new)构造函数来创建该类的实例对象,通过该对象来调用非静态方法等()

 

注意: 构造函数可以被私有化(private),因为构造函数也是“成员” ;

构造函数私有化后,其他类就不能直接创建该类的实例对象(即无法调用私有化构造函数)

PS:私有化构造函数,补充见本篇"14、静态的应用"

 

10主函数:public static void main(String[] args){ };

主函数是JVM默认所识别的入口函数,属于固定格式

虽然主函数允许重载,但JVM只能识别规定参数格式的主函数(唯一可修改的是参数名args)

(String[] args):其实是个String[]数组容器,可对其存储数据,可在运行该类时传递字符串数组给主函数,根据需要处理传递的数组数据。

 

11private关键字  

    (私有)权限修饰符,用于修饰类中成员(成员变量和成员函数);被私有化的成员只在本类中有效。

常见应用之一:      

   将成员变量私有化对外提供对应的setget方法对其进行访问提高对数据访问的安全性

set方法修饰符为void,而get方法修饰符与导入的数据类型有关(intString等)。】

   【注意:私有private仅仅是封装的一种表现形式,除外还有public(公共的)、无(缺省)等】

封装之所以对外提供访问方式,是因为可以在访问方式中加入逻辑判断语句对访问的数据进行操作、判断(不封装,加入逻辑判断等语句容易出现错误,封装也就提高代码健壮性)。

 

Java对成员变量的操作只能在方法中,方法可对成员变量及自己的局部变量进行操作。

在定义类的成员变量时可同时赋予初值,但是不能在声明后直接进行赋值(之后赋值只能在方法)

 

12this关键字:

特点:this代表其所在函数所属对象的引用(即this代表本类对象的引用)。


什么时候使用this关键字呢 ?

this多数时候存在,不过没有同名成员相互干扰情况,所以可省略)

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


其他解释定义:如果局部变量的名字与成员变量的名字相同,则在该局部变量存在的方法中成员变量被隐藏,暂时失效;如果想要在此方法中使用成员变量则要使用this关键字。


构造函数间调用只能用this语句(this语句只能在构造函数中)

this语句只能用在构造函数的第一行(因为调用的初始化动作要先执行)。】

this语句:this(name); ——>  newPerson(name);  

 


13static关键字: 用于修饰成员(成员变量和成员函数)。

被修饰后的成员具备以下特点:

1、随着类的加载而加载;(随类的消失而消失,所以生命周期最长)

2、优先于对象存在;     

3、被所有对象所共享;

4、可以直接被类名调用。

使用注意:

1静态方法只能访问静态成员(非静态方法可访问非静态成员和静态成员)

2、静态方法中不可以写thissuper关键字;

3、主函数是静态的(publicstatic void main(String[] args){…… })。

作用(利弊):

利: 对象的共享数据进行单独空间的存储(存储在内存的静态区)节省内存空间

   弊: 生命周期过长、访问出现局限性(静态方法只能访问/调用静态成员)。


资料补充:   (变量:成员变量、局部变量)

1、成员变量可分为实例变量和类变量关键字static修饰的变量就是类变量

2、类中的方法也分实例方法和类方法,同理:static修饰的方法就是类方法

(不被static修饰的变量、方法即实例变量和实例方法)

类变量类的加载而存在于静态区中;实例变量对象的建立而存在于堆内存中。


什么时候使用静态?

静态变量(类变量):当类中变量非类对象的特有数据(即共享数据)时,将该变量用static修饰成为静态变量。    【实例变量:对象中的特有数据要定义成非静态存在于堆内存中。】

静态函数: 当函数功能内部没有访问非静态数据(对象的特有数据)时,就可以定义为静态的。

(因为没有访问到对象的特有数据,所以不一定要创建对象来使用静态函数,因为静态函数可以通过类名直接调用)

 

14、静态的应用 

    当多个应用程序中都有共性功能时,可以将这些功能进行抽取,独立封装成为“工具类”,以便复用。

注意:  

1、由于该“工具类”中提供共性功能的方法(函数),基本上没有使用到该工具类中特有数据(实例成员),所以要求将这些工具类进行静态(static)修饰静态方法

2、同时该工具类也就没有必要在调用这些静态方法时创建对象(构造函数),所以可以将构造函数私有化(private修饰),强制使外部程序无法创建该类的对象

(Java程序默认会有无参构造函数,当该类对象没有封装数据时,创建对象就只是浪费内存空间。)

   3、因此当外部程序要使用这些共性静态方法时就只能通过类名调用静态方法

ArrayTool.getMax();   //通过工具类名调用所需的静态方法】

【建议多看几次Java基础视频教程第06-04面向对象(静态的应用-工具类),理解消化,这是Java面向对象的基础,后面的学习出现的Java工具就是根据这原理衍生创建。】

 

资料补充:     如何导入自建类?【如何导入自建类中的静态方法,简写代码?】

导入自建类:设置classpath路径:setclasspath= .; c:\...(指定目录)

导入静态方法:(这其实是后面内容,但没详讲自建类的)

1、在自建类源文件开头中添加包名代码:package mypack;

      (mypack为该自建工具类所在包名)

2、调用类的源文件开头添加调用静态方法的代码:import static mypack.ArrayTool.*;

    (要求该类所在的包mypack在调用程序的同一目录下,ArrayTool是该类名)。

 

15、设计模式:  (《设计模式》:Java中的23种设计模式。)

单例设计模式 使一个类在内存中只存在一个对象(避免过多的创建对象,达到数据的统一)

              (用于配置文件等要求数据统一的情况)

思路:    1私有化构造函数

          2、在类内部创建一个本类对象

          3、提供一个方法可以获取到该对象

主要格式:          

Class Single {

   private Single(){}

   private static Single s = new Single();

   public static Single getInstance()

   {     return s;    }

      ………………(正常添加该类中的特有数据与方法【非静态成员,因为使用对象】)

}

调用:    Single ss = Single.getInstance(); 

…………(调用该类中的方法等);

【上述这种类一进内存就先初始化对象的方式叫做饿汉式

而另一种方法调用时才初始化对象(执行给Single s赋值,由null变为newSingle())为懒汉式

 

饿汉式:类一进内存就先初始化对象。(多用于开发,因为要保证数据统一、又需要使用到其中的对象才用到单例设计模式,所以类一定需要加载的。)
懒汉式:对象调用时才初始化对象,或称延时加载。(少用、存在安全隐患)

class Single{
  private Single(){}
  private static Singles;    //默认初始化赋值null;
  public static Single getInstance() {
    if(s==null){
      synchronized(Single.class) //用同步代码块来加锁(要求该锁具有唯一性);
         //【该类所属的字节码文件对象. class】
         if(s==null)     //双重判断,减少判断锁。
           s = new Single();
    }
    returns;
 }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值