黑马程序员————面向对象(概述,封装,构造函数,this,static)

概述:

    面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。

理解面向对象:

  面向对象是相对于面向过程而言。比如:用手机发送短信,相对于面向过程而言强调的是功能 :打开手机-->编写短信-->发送短信。Java面向对象的思想就是强调具有功能的对象:手机打开,手机编写短信,手机发送短信。感觉这些过程是你自己亲自在做,而用面向对象的思却是你指挥着手机去做。面向对象和面向过程都是一种思想,面向对象是基于面向过程的。

  •   面向对象是相对面向过程而言。
  •   面向对象和面向过程都是一种思想。
  •   面向过程:强调的是功能行为。
  •   面向对象:将功能封装进对象,强调了具备功能的对象。面向对象时基于面向过程的。
  •   过程其实就是函数,对象是将函数等一些内容进行了封装。

面向对象的特点:

  1.    是一种符合人们思考习惯的思想。
  2.    可以将复杂的事情简单化。
  3.    将程序员从执行者转换成了指挥者。

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

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

 

封装(Encapsulation):

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

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

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

封装的表现形式之一  --> private:私有,权限修饰符,用于修饰类中的成员(成员函数,成员变量)。私有只在本类中有效。

  • 私有只是封装的一种表现形式。之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作,提高代码的健壮性。
  • 一个成员变量 通常会对应两个访问方式一个是设置值,一个是获取值。

构造函数:

    

  • 定义格式:
    class 类名称
    {
    访问权限 类名称(类型1 参数1,类型2 参数2,…)
    {
    程序语句;
    }
    }

    特点:

    • 1 函数名与类名相同。
    • 2 不用定义返回值类型。
    • 3 不可以写return语句。

    作用:

       给对象初始化。

  • 注意:
    •  默认构造函数的特点。
      • 当一个类中没有定义构造函数时,那么系统会给该类加入一个空参数的构造函数。
      • 当在类中自定义了构造函数之后,默认的构造函数就没有了
    •  多个构造函数式以重载的形式存在的。
      • 构造函数是给不同的对象进行分别初始化。
  • 构造函数 对象一建立就会调用与之对应的构造函数
  • 一个类中默认会有一个空参数的构造函数,这个默认的构造函数的权限和所属类一致。
    • 如果类被public修饰,那么默认的构造函数也带public修饰符。
    • 如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
    • 默认构造构造函数的权限是随着的类的变化而变化的。
  • 构造函数与一般函数不同之处:
    • 构造函数和一般函数在写法上有不同。
    • 在运行上也有不同:构造函数是在对象一建立就运行。给对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。
    • 一个对象建立,构造函数只运行一次。而一般方法可以被对象调用多次。
  • 什么时候定义构造函数
    • 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
  • 构造函数可以被私有化,但是被私有化的构造函数式不能创建对象的。

     

    this关键字:

  • this:代表本类的对象,代表它所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
  • 当定义类中功能时,该函数内部要用到调用函数的对象时,这时用this表示这个对象。但凡本类功能内部使用到了本类对象,都用this表示。
  • 应用:
    • 用于区分同名变量
    • 用于构造函数之间进行互相调用。
  • 注:this语句只能定义在构造函数的第一行。初始化动作要先执行,如果初始化中还有初始化的话,就先执行更细节的初始化。

     

    示例:

    class Person
    {
    	//定义私有属性
    	private String name;
    	private int age;
    	Person (int age)//构造函数
    	{
    		this.age = age;
    	}
    	Person(String name)
    	{
    		//name = name; //局部变量的名称和成员变量的名称相同,此时两个name都是局部的name。
    		this.name = name;//this 表面上是区分成员变量和局部变量。
    	}
    	Person(String name,int age)
    	{
    		this(name);//this语句,调用构造函数Person(String name)
    		//this.name = name;
    		this.age = age;
    	}
    	public void speak()
    	{
    		System.out.println("name =" + this.name + ",,age =" + this.age);
    		this.show();
    	}
    	public void show()
    	{
    		System.out.println(this.name);
    	}
    	/*
    	需求:给人定义一个用于比较年龄是否相同的功能。
    	*/
    	public boolean compare(Person p)
    	{
    		return this.age == p.age;
    	}
    }
    
    class PersonDemo 
    {
    	public static void main(String[] args) 
    	{
    		Person p = new Person("lisi ");
    		Person p1 = new Person("zhangsan");
    		//在一个类中成员之间完成互相调用都是对象来完成的。
    		p.speak();
    		p1.speak();
    		Person p2 = new Person(15);
    		Person p3 = new Person(20);
    		boolean b = p2.compare(p3);//this和p2指向了同一个地址值,也就是同一个对象
    		System.out.println(b);
    	}
    }

    结果如下

     

    static(静态)

  • 用法:
    1. 是一个修饰符,用于修饰成员(成员变量,成员函数)。
    2. 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
    3. 还可以直接被类名调用。类名.静态成员。
  • static特点:
    1. 随着类的加载而加载  。
      • 当类加载到内存中时,static所修饰的成员就已经在内存中(方法区,共享区,数据区)开辟好了空间。
      • 也就是说静态会随着类的消失而消失,生命周期最长。
    2. 优先于对象存在。静态是先存在的,对象后存在。
    3. 被所有对象所共享。
    4. 可以直接被类名所调用。 类名.静态成员。
  • 实例变量和类变量的区别:
    • 存放位置:
      • 实例变量:随着对象的建立而存在于堆内存中。
      • 类变量:随着类的加载而存在于方法去中。
    • 生命周期:
      • 实例变量:生命周期随着对象的消失而消失。
      • 类变量:生命周期最长,随着类的消失而消失。
  • 静态的使用注意事项:
    1. 静态方法只能访问静态成员(成员变量,成员函数).。非静态方法可以访问静态,也可以访问非静态。
    2. 静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字。
    3. 主函数是静态的。
  • 静态有利有弊
    • 利处:对对象共性数据进行单独空间存储,节省内存空间。没有必要每个对象中都存储一份,可以直接用类名调用。
    • 弊端:生命周期过长,访问出现局限性,静态成员只能访问静态。
  • 什么时候使用静态?
    1. 什么时候定义静态变量(类变量)
      • 当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。
    2. 什么时候定义静态函数
      • 当功能内部没有访问到非静态数据(对象的特有数据),那么这时该函数(功能)可以定义成静态。
  •  静态代码块
    • 就是一个有静态关键字标示的一个代码块区域。定义在类中。

    •  格式:
     static
     {
    静态代码块中执行语句。
     }
    • 特点:
      • 随着类的加载而执行,只执行一次,如果和主函数在同一类中,优先于主函数执行。
    • 作用:
      • 用于给类进行初始化的。
    •  实例:
    class StaticCode{
    	static
    	{
    		System.out.prontln("a");
    	}
    }
    
    class StaticCodeDemo
    {
    	static
    	{
    		System.out.prontln("b");
    	}
    	public static void main(String[] args)
    	{
    		new StaticCode();
    		new StaticCode();//因为类已经加载,静态代码块已经执行过,所以没有打印结果。
    		System.out.prontln("over");
    	}
    	static
    	{
    		System.out.prontln("c");
    	}
    }
    
    //打印结果 b c a over

     

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值