黑马程序员__java基础__面向对象(封装、单例设计)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
面向对象
一.面向对象的概念:
       我们知道c语言是一门面向过程的语言,那么面向对象就是相对面向过程而言的。
       如把大象装进冰箱,c语言强调的是功能行为:打开冰箱——>把大象装进冰箱——>关闭冰箱。而Java面向对象的思想就是强调具有功能的对象:冰箱打开,冰箱存储,冰箱关闭。感觉上就是过程是你自己亲自在做,而面向对象却是你指挥着对象去做。
       面向对象和面向过程都是一种思想,就看自己怎么想了,面向对象是基于面向过程的。
二.面向对象的特点:
(1)是一种符合人们思考习惯的思想
(2)可以将复杂的事情简单化
(3)将程序员从执行者转换成了指挥者
(4)完成需求时:
        1. 先要去找具有所需的功能的对象来用。
        2. 如果该对象不存在,那么创建一个具有所需功能的对象。

        3.这样可以简化开发并提高复用。
三.面向对象的特征:
(1)封装(encapsulation)
(2)继承(inheritance)
(3)多态(polymorphism)
类与对象
一.类的定义
       使用计算机语言就是不断的描述现实生活中的事物,而java中描述事物通过类的形式体现,类是具体事物的抽象。
       生活当中描述事物无非就是描述事物的属性和行为。如:人的身高,体重等属性;讲话跑步等行为。Java则是用类class来描述对象的属性和行为。定义类其实就是在定义类中的成员(成员变量和成员函数)。

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

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

二.  成员变量与局部变量

(1)成员变量

        1. 成员变量定义在类中,在整个类中都可以被访问。
        2. 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
        3. 成员变量有默认初始化值。

(2)局部变量

        1. 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
        2. 局部变量存在于栈内存中。

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

        4. 局部变量没有默认初始化值。

三.匿名对象

匿名对象是对象的简化形式。

匿名对象两种使用情况:

1、当对对象方法仅进行一次调用的时。

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

封装

一.封装的概念

        是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

        用 private关键字修饰类中的成员(成员变量,成员函数),将成员变量私有化,对外提供对应的setget方法对其进行访问。提高对数据访问的安全性。

二.封装的好处

(1)将变化隔离

(2)便于使用

(3)提高复用性

(4)提高安全性

三.封装的原则

(1)将不需要对外提供的内容都隐藏起来

(2)把属性都隐藏,提供公共方法对其访问

例子:

package day18;

class Person1//描述人物对象的类
{
	private int age;//人对象的年龄属性
	public void setAge(int a)//提供访问方法,并判断是否有效
	{
		if(a>0 && a<130)
			age = a;
		else
			System.out.println("年龄超出范围");
	}
	public int getAge()//提供获取方法
	{
		return age;
	}
	public  void speak()
	{
		System.out.println("age="+age);
	}
}
class Demo1  
{
	public static void  main(String[] args)
	{
		Person1 p = new Person1();//创建人物对象
		p.setAge(30);//利用封装提供的访问方法进行修改年龄属性
		p.speak();
	}
}

构造函数

一.特点、作用

(1)特点:

          类名与函数名相同

          不用定义返回值类型

          不用写return语句

(2)作用:

           给对象初始化

二.构造函数与一般函数的区别

(1)构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。对象创建时,会调用并且只调用一次。
        一般函数:对象创建后,需要函数功能时才调用。对象创建后,可以被调用多次。

(2)当一个类中没有定义构造函数时,那么系统就会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。

三.构造函数与构造代码块

(1)构造代码块给对象进行初始化。对象一建立就运行,而且优先于构造函数运行。

(2)构造代码块是给所有对象进行初始化,构造函数是给对应的对象初始化。

关键字(this、static)

一.this关键字

(1) this代表它所在函数所属对象的引用。 简单说:哪个对象在调用this所在的函数,this就代表哪个对象。

(2)当定义类中功能时,该函数内部要用到调用该函数的对象时用this来表示这个对象。本类功能内部使用到了本类对象,都用this表示。

(3) 用于构造函数之间进行互相调用。如:this(name);this语句只能定义在构造函数的第一行。因为初始化要先执行。

例子:

package day05;
/**
 * this的两种用法(区分变量、函数间调用)
 * @author Administrator
 */
class Person
{
    private String name ;
    private int age ;
    Person(String name)
    {
       this.name = name;//通过this区分成员变量和局部变量
    }
    Person(String name, int age)
    {
       this(name);//this也可以用于在构造函数中调用其他构造函数
       this.age = age;
    }
    public void speak(){
       System.out.println(name + ":" + age );
    }
}
class Demo1{
 public static void main(String[] args)
 {
      Person p1 = new Person("zhangsan" );
      p1.speak();
      Person p2 = new Person("lisi" ,20);
      p2.speak();
 }
} 

二.static关键字

(1)static是个修饰符,用于修饰成员(成员变量和成员函数)。其特点为:

1.随着类的加载而加载

2.优于对象存在

3.被所有对象共享

4.可以直接被类名调用

(2)静态变量(类变量)与成员变量(实例变量)的区别;

        1、存放位置。

                   类变量随着类的加载而存在于方法区中。

                   实例变量随着对象的建立而存在于堆内存中。

        2、生命周期。

                   类变量生命周期最长,随着类的消失而消失。

                   实例变量生命周期随着对象的消失而消失。

(3)什么时候使用静态?

        1、什么时候定义静态变量(类变量)呢?

                   当对象中出现共享数据时,该数据被静态所修饰。

                   对象中的特有数据要定义成非静态存在于堆内存中。

        2、什么时候定义静态函数呢?

                   当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

(4) 静态使用注意事项:

        1、静态方法只能访问静态成员。非静态方法既可以访问静态也可以访问非静态。

                   因为静态优先对象存在,非静态成员只有在对象建立后才存在。

        2、静态方法中不可以定义this,super关键字。

                   因为静态优先于对象存在。所以静态方法中不可以出现this。

(5) 定义一个新对象都做了哪些事情?对象的初始化过程:

        1、把类名.class文件加载到内存中。

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

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

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

        5、对属性进行显示初始化。

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

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

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

单例设计

一.概念

设计模式:对问题行之有效的解决方式,其实它是一种思想。

单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
      比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
      如何保证对象唯一性呢?
      1、不允许其他程序用new创建该类对象。
      2、在该类创建一个本类实例。
      3、对外提供一个方法让其他程序可以获取该对象。

二.步骤

      1、将构造函数初始化。

              例:private Single(){}   将构造函数私有化的目的是不给外部建立对象

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

              例:private static Single s= new  Single();

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

              例:public static Single getInstance()

                     {

                            return  s;

                      }

三.实例

(1)饿汉式

class Single
{
    private Single(){}
    private static Single s=new Single();
    public static Single getInstance()
    {
    	return s;
    }
}   
       它的特点是先初始化对象。如: Single 类一进内存,就已经创建好了对象。在实际开发中,出于安全考虑,建议使用饿汉式。

(2)懒汉式

class Single
{
    private Single(){}
    private static Single s=null;
    public static Single getInstance()
    {	
    	if(s==null)
    	<span style="white-space:pre">	</span>s=new Single();
    	return s;
    }
}   
       它的特点对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值