java基础——面向对象(一)

来源:互联网 发布:网络安全保卫大队在哪 编辑:程序博客网 时间:2024/05/20 19:46

一、      面向对象

面向对象概述:面向对象是基于面向过程的,将功能封装进对象,强调的是具备功能的实体

面向对象的特点:     

 ①是一种更加符合人们思维习惯的编程方法

 ②将复杂的问题简单化了

 ③由执行者转换成了指挥者

面向对象举例说明:

①     电脑城买电脑:假如我想买一台电脑,因为并不懂电脑,所以我可以找懂电脑的人帮我去做一些事情,首先,先让他在网上查硬件的性价比,在网上找一些资料,之后让他去电脑城,询价,要货比三家,找出一个最合适的价格,还可以让他去砍砍价,OK后让电脑城老板组装电脑,让他在边上监督下,以免他们偷换了电脑零件,组装好后,付钱那电脑走人。

在这个例子中,本来这些事情都应该是我去做的,而我找了一个懂电脑的人去帮我搞定,此时,我就由一个执行者转换成了指挥者,而我找的这个人就是一个对象,这个对象懂电脑,具备买电脑的功能,所以我就可以调用他,去帮我完成买电脑的事情。

②     面试:当在面试时面试官让谈谈什么是面向对象时可根据当时的情况随机应变,可以这样说:面试官,你就在用面向对象的额思想在做事情,首先,由于公司的业务发展,需要招聘一些具备编程能力的人,而我就是这个具备编程能力的人,你可以指挥我去工作,而你就是指挥者而我就是那个执行者,所以你就在用面向对象的方式在招聘员工

 

类与面向对象的关系:

  什么是类:类是用于存放具备功能的实体的

  什么是对象:而对象就是这个实体的一部分

成员变量与局部变量的区别:

①  作用的范围不同:成员变量作用于整个类中,而局部变量只作用于函数内

②  在内存中存放的位置不同:成员变量存放在堆内存中,局部变量存放在栈内存中

③  生命周期不同:成员变量是随着对象的出现而出现,局部变量是随着函数的加载而加载,函数运算完后就被释放

④  默认的初始化值不同:成员变量有默认初始化值而局部变量没有初始化值,成员变量中int型的默认初始化值是0,double类型的默认初始化值是0.0,boolean类型的默认初始化值是flase……

匿名对象的应用:

  匿名对象顾名思义就是没有名字的对象,

  比如:Car  c= new Car();  可以写成  newCar

匿名对象使用方式一:当对象只调用一次时就可以写成匿名对象

  Car  c = new Car();   c.run();可以改写成:

  new Car().run();

匿名对象使用方式二:可以将匿名对象作为实际参数进行传递

  show(new Car);

 

二、      封装(Encapsulation)

封装概述:对外隐藏对象的属性和实现细节,只对外提供公共的访问方式

封装的好处:

①      藏了实现细节,仅对外提供公共的访问方式,提高了安全性,实现了可控

②      提高了易用性

③      提高了复用性

④      隔离了变化

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

私有(private):私有只在本类有有效,用于修饰成员函数和成员变量

为什么要用私有?私有就是隐藏了对象的属性或函数,这样的话,调用者就无法直接访问了,可以通过给他提供的公共访问方式进行访问这样可以实现可控提高代码健壮性

 

构造函数:

①   函数名和类名相同

②   不需要定义返回值和返回值类型

③   不能写return语句

构造函数的作用:用于给对象进行初始化,当分析事物时,该事物已建立就会具备一些特性或者行为,那么就将这些内容定义在构造函数内

号外:对象已建立就会自动调用与之对应的构造函数,当一个类中没有定义构造函数时,那么默认会有一个空参数的构造函数,一旦自己建立了构造函数,那么这个空参数的构造函数就不存在了

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

①      写法上不同:构造函数没有返回值和返回值类型而一般函数则要定义返回值和返回值类型

②      运行方式不同:构造函数在对象已建立就会被调用,而且只是调用一次,而一般函数只有被对象调用是才会执行,而且可以被调用多次

③      一般函数不能直接调用构造函数

构造代码块:给对象进行初始化,是优先于构造函数执行的,一定会被执行

构造函数与构造代码块的区别:

  构造函数是给相对应的对象进行初始化的,而构造代码块则是给所有对象进行的统一初始化

 

this关键字:

  this代表的是本类对象,那么他到底代表的是那一个呢?代表的是他所在函数所属对象的引用,也就是说,哪个对象调用this所在的函数,this就代表哪个对象

this的用法:

①   用于区分成员变量和局部变量  如 this.name(成员)=name(局部);

②   带上参数列表的方式就可以访问本类中有相同参数列表的构造函数,如this(li);就可以访问本类中带有一个参数列表的构造函数

③   this只能写在第一句 因为初始化动作要先完成,而且只能用在构造函数之间

号外:凡是访问了对象中数据的方法就都持有this关键字

 

static关键字

  用法:是一个修饰符,用于修饰成员(成员变量,成员函数)

当一个成员被静态修饰时,他就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用,格式:类名.静态成员

static特点:

①   随着类的加载而加载,随着类的消失而消失,说明生命周期很长

②   优先于对象存在(静态是先存在的,对象是后存在的)

③   静态修饰的成员被多个对象共享

④   可以直接被类名调用

号外:静态在内存中的存放位置是在方法区中

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

①   名称上的区别:成员变量也叫实例变量,静态变量也叫类变量

②   存储上的区别:成员变量存储在堆内存的对象中,静态变量存储在方法区的静态区中

③   生命周期不同:成员变量随着对象的出现而出现,随着对象的消失而消失,静态变量随着类的出现而出现,随着类的消失而消失

使用的注意事项:

①      静态方法只能访问静态成员,非静态方法既可以访问静态成员也可以访问非静态成员

②      静态方法中不存在this、super关键字,因为静态是优先于对象存在的

③      主函数是静态的

静态的好处:对对象的共享数据进行单独空间的存放,节省了空间,没有必要每一个对象都存在一份;可以直接被类名调用

静态的弊端:生命周期过长,访问出现局限(静态虽好,只能访问静态)

什么时候使用静态呢?

①      什么时候定义静态变量:当对象中出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中

②      什么时候定义静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能就可以定义成静态的

静态代码块:随着类的加载而执行,并且只执行一次,用于给类进行初始化

局部代码块:用于控制局部变量的生命周期

对象的初始化过程:

1、        加载指定的字节码文件进内存

2、        通过new在堆内存中开辟空间,分配首地址值

3、        对对象中的属性进行默认初始化

4、        调用与之对应的构造函数,构造函数压栈

5、        构造函数中执行隐式的语句super()访问父类中的构造函数

6、        对属性进行显示初始化

7、        调用类中的构造代码块、

8、        执行构造函数中的自定义的初始化代码

9、        初始化完毕,将地址赋值给指定引用

单例设计模式:为了保证对象在内存中的唯一性

1、        为了避免其它程序过多建立该类对象。先控制禁止其它程序建立该对象

2、        还为了让其它程序可以访问到该类对象,只好在本类中自定义一个对象。

3、        为了方便其它程序对自定义对象的访问,可以对外提供一些访问方式。

代码体现:

1、        将构造函数私有化

2、        在类中创建一个本类对象

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

饿汉式(开发中常用)

class Single

{

private Single(){}

private final static Single s= new Single();

public static SinglegetInstance()

{

       return s;

}

}

class SingleDemo {

public static voidmain(String[] args)

{

       Single sss =Single.getInstance();

}

}

 

懒汉式(面试时常用)

class Single

{

private static Single s =null;

private Single(){}

public static SinglegetInstance()

{

//最终解决方案

/*   if(s==null)

 *   {

 *        Synchronized(Single.class)

 *        {

 *              if(s==null)

 *              {

 *                   s= new Single();

 *              }

 *        }

 *   returns;

 *   }

 */

       if(s==null)

             s = new Single();

       return s;

}

}

0 0
原创粉丝点击