一、什么是面向对象

         当你想要用一件东西完成一个动作或做一件事情时,这个动作或这件事情是这件东西可以完成的动作,我们要做的就是指挥这件东西,告诉它去做。比如开门,   我们只是转一下把手,给门一个要打开的信号,然后门通过自己具备的功能,转动门轴、合页等,实现门的打开。这就是Java中的面向对象的思想。C语言中是面向   过程思想,强调功能行为,例如:打开门——关闭门。而Java中的面向对象的思想是基于面向过程的思想而来的,强调具有功能的对象,例如:门打开——门关闭。   在面向对象的思想中,操作者变成了调用者,通过调用对象,来实现相关需求。

 面向对象的特点 :

        面向对象是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序的执行者转化为调用者。 在操作中,应先去寻找封装了所需功能的对象来调用。没   有的话就创建一个封装所需功能的对象。 这样做可以简化开发也可以提高复用性。Java的开发过程就是不断的创建对象,使用对象,指挥对象做事情的。而设计的     过程就是在管理和维护对象之间的关系。

  面向对象的特征:封装(encapsulation),继承(inheritance),多态(polymorphism).

 

 二、怎么用面向对象      

 1.类和对象

          使用计算机语言就是不断的描述现实生活中的事物,而Java中描述事物通过类的形式体现,类是具体事物的抽象。生活中描述事物就是描述事物的属性和行  为,如人的年龄、人的身高等属性以及说话吃饭等行为。Java中就是用类class来描述对象的属性和行为。定义一个类就是定义在类中的成员(成员变量(对应属性)和成  员函数(对应行为))。而对象是该类事物实实在在存在的个体。类和对象的关系就如同设计汽车的图纸与汽车的关系,图纸就是类,汽车就是具体的对象。

           定义一个简单的类,并创建它的对象。如:


class Demo
{
	public static void main(String[] args) 
	{    
		//创建student的一个对象。
		Student s=new Studnet();
		//给对象的属性赋值。
		s.name="小明";
		//调用对象的动作
		s.speak();
	}
}
//定义一个表示学生的类,类中定义学生的姓名、年龄属性,以及学习的行为。
class Student
{
  String name;
  int age;
  public void study(){
	  System.out.println("在学习");
  }
}

  2.成员变量和局部变量

          两者在作用范围和内存中分配不同。成员变量定义在类中,在整个类中都可以被访问;成员变量随着对象的建立而建立,存在于对象所在的堆内存中。并且有    默认的初始化值。

          局部变量只定义在局部范围内,如:函数、语句内等,局部变量存在与栈内存中。作用的范围结束,变量空间会自动释放,并没有默认的初始化值。

   3.匿名对象

          对象的简化。在两种情况下可以使用匿名对象:当对对象仅调用一次时或者将匿名对象作为实际参数进行传递。如果对一个对象的成员进行多次调用时,就不     能用匿名对象了。


 

   4.封装

封装能够将变化隔离,便于使用,提高代码的重用性与安全性。

           而私有(private)是封装最常见的表现形式。private:权限修饰符,用于修饰类中的成员(成员变量、成员函数),私有的成员只在本类中有效。在以后的   操作中,定义一个类通常将成员变量私有化,对外提供对应的set,get方法对其进行访问。这样做提高了数据的安全性。

    如下图:

    

class Demo
{
	public static void main(String[] args) 
	{    
		//创建student的一个对象。
		Student s=new Student();
		//调用访问方法,给对象年龄赋值。
		s.setName("小明");
		//调用获取方法,获取对象年龄。
		s.getName();
	}
}
//定义一个表示学生的类,类中定义学生的姓名属性,以及学习的行为。
class Student
{
  //将成员属性name私有
  private String name;
  //提供访问方法
  public void setName(String studentName){
	    name=studentName;
  }
  //提供获取方法
  public String getName(){
	  return name;
  }
  public void study(){
	  System.out.println("在学习");
  }
}



  5.构造函数

         构造函数的函数名与类名同名,不用定义返回值类型,不可以写return语句。构造函数是用来给对象进行初始化的。当一个类中没有定义构造函数时,

  系统会默认给该类加入一个空参数的构造函数。当类中自定义了构造函数之后,默认的构造函数就没有了。 构造函数与一般函数除了在写法上有很大不       同,在运行时也有很大不同,构造函数在对象一建立就运行,给对象初始化,而一般方法是对象调用才执行;一个对象建立,构造函数只运行一次,而一   般方法可以被对象调用多次。当分析事物时,如果该事物存在具备一些特性或者行为,那么可以将这些内容定义在构造函数中。          

        构造代码是给对应的对象进行初始化,而构造代码块是给所有对象初始化。当对象一建立,构造代码块就运行,而且优先于构造函数。构造代码块中  定义的是不同对象共性的初始内容。

       例如:


class Demo
{
	public static void main(String[] args) 
	{    
		//创建student的一个对象。
		Student s=new Student("小明");
		//调用方法
		s.study();
	}
}
//定义一个表示学生的类,类中定义学生的姓名属性,以及学习的行为。
class Student
{
  //将成员属性name私有
  private String name;
  //定义构造函数
  Student(String name)
  {
	  this.name=name;//this表示初始化的对象,因为成员变量名和局部变量名一样,所以用this加以区分。
     System.out.println("我的名字是"+name);
  }
  //定义构造代码块
  {
     System.out.println("我是一名学生");
  }
  //提供访问方法
  public void setName(String name){
	    this.name=name;
  }
  //提供获取方法
  public String getName(){
	  return name;
  }
  public void study(){
	  System.out.println("在学习");
  }
}

执行结果

java黑马程序员教材 pdf 黑马程序员java讲义_构造函数

   6.this关键字  

         从上面的程序可以了解this关键字的用法,this代表它所在函数所属对象的引用,就是哪个对象在调用this所在的函数,this就代表哪个对象。当定义类  中功能时,该函数内部要用到调用该函数的对象时,就用this来表示这个对象。

一般函数不能直接调用构造函数,因  为this语句不能用在一般函数中,只能用在构造函数间。

         例如:     


Student(String name)
  {
	  this.name=name;
    
  }
  Student(String name,int age)
  {
        this(name);
        this.age=age;
  }

 

  this关键字有时可以不写,系统会默认为引用所在函数的对象,但当出现成员变量和局部变量同名时,就必须写上this,加以区分。构造函数间调用时要用上this语句。

 7.static关键字

         static:静态修饰符,用于修饰类中的成员(成员变量和成员函数)。当成员被静态修饰后,除了可以被对象调用外,还可以直接被类名调用(类名.静态  成员)。静态成员随着类的加载而加载,也随着类的消失而消失,生命周期长。静态成员先于对象存在。静态成员可以被所有对象共享。由于静态成员可以直接被类名调用,所以静态成员变量又称为类变量。而非静态成员变量成为实例变量。

        实例变量和类变量的区别:类变量随着类的加载而存在于方法区中,实例变量随着对象的建立而存在于堆内存中;类变量生命周期最长,随着类的消  失而消失。实例变量生命周期短,随着对象的消失而消失。

         当对象中出现共享数据时,该数据可以被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中;当功能内部没有访问到非静态数据(对象的 特有数据),那么该功能可以定义成静态的。       

         定义静态变量,可以对共享数据进行单独空间的存储,节省内存空间,但生命周期过长;定义静态方法,只可以访问静态成员(非静态方法既可以访问  静态也可以访问非静态),具有局限性。静态方法中不可以定义this、super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this。

         主函数是静态的。


         静态代码块:随着类的加载而执行,执行一次。并优先于主函数。用于给类进行初始化。

         格式:static{执行语句}

 8.主函数

一个特殊的函数。作为程序的入口,可以被JVM调用。

    主函数的定义:

        public:代表着该函数访问权限是最大的。

        static:代表主函数随着类的加载就已经存在了。

        void:主函数没有具体的返回值。

        main:不是关键字,但是是一个特殊的单词,可以被JVM识别。

     (String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。

        args:arguments  参数  。唯一可以更改的地方。

 9.对象的初始化过程:

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

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

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

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

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

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

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

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

 10.单例设计模式

         设计模式是指解决某一问题最行之有效的方法。Java中有23种设计模式。单例设计模式是经常会用到的一种模式。单例设计模式中一个类在内存中只     存在一个对象,保证了内存中的对象唯一性。单例设计模式有两种格式:懒汉式和饿汉式。

          (1)饿汉式:饿汉式中先建立对象,class类一加载进内存,就创建该类对象。在实际开发中,经常使用饿汉式,保证程序的安全性。


class Single
{
	//将构造函数私有化
	private Single(){}
       //在类中创建本类对象
	public static Single s=new Single();
	//提供获得该类对象的访问方式
	public static Single getInstance(){
		return s;
	}
}

        (2)懒汉式:方法被调用时,才在内存中创建对象。即对象的延时加载。


class Single
{
	//将构造函数私有
	private Single(){}
    //定义引用变量 
	public static Single s=null;
	//提供获得该类对象的访问方式
	public static Single getInstance(){
		//创建本类对象
		if(s==null)
		     s=new Single();    
		return s;
	}
}