黑马程序员__JAVA基础__面向对象(一)

 -------android培训java培训、java学习型技术博客、期待与您交流! ------------

 

1.面向对象的概念

   理解面向对象:

       1.面向对象是相对面向过程而言

       2.面向对象和面向过程都是一种思想

       3.面向过程强调的是功能行为

       4.面向对象是将功能封装进对象,强调具备了功能的对象

       5.面向对象是基于面向过程的

   面向对象的特点:

       1.是一种符合人们思考习惯的思想

       2.可以将复杂的事情简单化

       3.将程序员从执行都转换成了指挥者(此条最能体现面向对象)

    完成需求时要先去打具有所需的功能的对象来用,如果该对象不存在,那么创建一个具有所需功能的对象,这样能简化开发并提高复用。

   面向对象开发,设计,特征:

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

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

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

 

2.类与对象的关系

    使用计算机语言就是不断的在描述现实生活中的事物

    Java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义。

    对象即是该类事物的实实在在的个体

   如图:

 

 

   可以理解为:

       类就是图纸

       汽车就是堆内存中的对象

 

   类的定义

   1.生活中描述事物无非就是描述事物的属性和行为

       如:人有身高,体重等属性,有说话,打球等行为

   2.java中用类class来描述事物也是如此

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

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

   3.定义类其实在定义类中的成员(成员变量和成员函数)。

 

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

      1.作用范围:成员变量作用于整个类中,整个类都可以被访问。而局部变量作用于函数或者语句中。

      2.在内存中的位置:成员变量随着对象的建立而建立,存在于对象所在的堆内存中,因为对象的存在,才在内存中存在。而局部变量存在栈内存中,作用的范围结束,变量空间就会自己释放。

      3.初始化方式:成员变量都默认的初始化值。而局部变量没有默认的初始化值。

面向对象示例:

Class Car//对Car这类事物进行描述
{
  //属性描述
  String color = "red";
  int num = 4;
  viod show()//运行行为
  {
      System.out.println("color="+color+"..num=" +num);
  }
}
class CarDemo
{
  public static void main(String[] args)
  {
        Car c = nwe Car();//建立对象,c是类类型变量,指向对象
        c.color = "blue";//对对象的属性进行修改
        C.show();//使用对象的功能
        //打印结果:color=blue..num=4
  }
}

 

对象内存结构:

 

    匿名对象

        匿名对象是对象的简化方式

    匿名对象两种使用情况

        1.当对对象方法仅进行一次调用时(这样写比较简化)

        2.匿名对象可以作为实际参数作为传递

public static void show(Car c)
{
  c.num = 3;
  c.color = "black";
  C.run();
}
//调用:show(new Car());

 

3.封装(Encapsulation)

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

    好处:

       1.将变化隔离

       2.便于使用

       3.提高安全性

       4.提高重用性

   封装原则:

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

      2.把属性都隐藏,提供公共方法对其访问。之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作。提高代码健壮性

 

4.private(私有)关键字

   1.是一个权限修饰符。

   2.用于修饰成员(成员变量和成员函数)。

   3.被私有化的成员只在本类中有效。

   示例代码:

class Person
{
  //将age私有化以后,类以外即使建立了对象也不能直接访问
  private int age;
  //Person类中提供对应访问age的方式
  public void setAge(int a)//设置
  {
  	if(a>0 && a<130)//在访问方式中加入逻辑判断语句
  	{
            age = a;
            speak();
	}
	else
	    System.out.println("feifa age");
    }
    public int getAge()//获取
    {
        return age;
    }
    private void speak()//调用方法
    {
        System.out.println("age="+age);
    }
}
  
class PersonDemo
{
    public static void  main(String[] args)
    {
        Person p = new Person();
        p.setAge(40);
  }
}


特别注意:私有仅仅是封装的一种表现形式。

   构造函数

   特点:

       1.函数名与类名相同

       2.不用定义返回值类型

       3.不可以写return语句

   作用:给对象进行初始化。

   注意:

       1.默认构造函数的特点:

           对象一建立就会调用与之对应的构造函数

          当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。

           当在类中自定义了构造函数后,默认的构造函数就没有了。

       2.多个构造函数是以重载的方式存在的。

   构造代码块

   作用:给对象进行初始化。

       对象一建立就运行,而且优先于构造函数执行。

   与构造函数的区别

       1.构造代码块是给所有对象进行统一初始化,

       2.构造函数是给对应的对象初始化。

       3.构造代码快中定义的是不同对象共性的初始化内容。

 

5.this关键字

   用于区分局部变量和成员变量同名情情况

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

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

   在函数内需要用到调用该函数的对象时,就用this,如:

class Person
{
  private String name;
  private int age;
  /*
  需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
  */
  public boolean compare(Person p)
  {
  	return this.age==p.age;//谁调用这个方法,this就代表谁
  }
}   
class PersonDemo 
{
  public static void main(String[] args) 
  {
  	Person p1 = new Person(20);
  	Person p2 = new Person(25);
  	boolean b = p1.compare(p2);//p1调用这个方法
  	System.out.println(b);//输出结果为false
  }
}


 

6.static(静态)关键字

   用于修饰成员(成员变量和成员函数)

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

       1.随意类的加载而加载

       2.优先于对象存在

       3.被所有对象所共享

       4.可以直接被类名调用

   使用注意:

       1.静态方法只能访问静态成员(非静态方法既可以访问静态也可以访问非静态)

       2.静态方法中不可以写this,super关键字(因为静态优先于对象存在。所以静态方法中不可以出现this)

       3.主函数是静态的

   静态的好处与弊端

       好处:

           1.对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。

           2.可以直接被类名调用。

       弊端:

           1.生命周期过长。

           2.访问出现局限性。(静态方法只能访问静态成员)

   静态什么时候用?

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

           当对象中出现共享数据时,该数据要被静态所修饰。(售票的例子,票的数量)

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

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

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

静态代码示例:

class Person
{
  String name;//成员变量,实例变量。
  static String country = "CN";//静态的成员变量(类变量),共享数据
  public void show()
  {
  	System.out.println(name + "::::"+country);
  }
}
  
class  StaticDemo
{
  public static void main(String[] args) 
  {
  	Person p = new Person();
  	p.name = "zhangsan";
  	p.show();  
  	System.out.println(Person.country);//直接被类名调用
  }
}

   上述代码中有实例变量和类变量,他们的区别:

       1.存放位置:

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

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

       2.生命周期:

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

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

 

   静态代码块

   static

   {

       静态代码块中的执行语句。

   }

   特点:随着类的加载而执行,只执行一次,并优先于主函数,用于给类进行初始化的。

   静态代码块,构造代码块,构造函数不同的作用:

   static//静态代码块,给类初始化

   {

   }

   //构造代码块,给对象初始化

   {

   }

   Demo()//构造函数,给对应对象初始化

   {

   }

代码解析:

class Father
{
  static//静态代码块,给类初始化
  {
      System.out.println(“A”);
  }
  
  //构造代码块,给对象初始化
  {
      System.out.println(“B”);
  }
  
  Father()//构造函数,给对应对象初始化
  {
      System.out.println(“C”);
  }
}
  
class Child extends Father
{
  static//静态代码块,给类初始化
  {
      System.out.println(“D”);
  }
  
  //构造代码块,给对象初始化
  {
      System.out.println(“E”);
  }
  
  Child()//构造函数,给对应对象初始化
  {
      System.out.println(“F”);
  }
}
  
class Demo
{
  public static void main(String[] args)
  {
      Child c = new Child();
  }
}
/*
打印结果:ADBCEF
原因:先给两个类初始化,再给对象初始化,最后给c这个对象初始化。(父类执行在前)
*/


 

个人总结

    本节要理解java面前对象是什么,明白对象的建立与对象在内存中的存储方式和状态,以及掌握所学关键字,掌握封装的好处及合理运用封装,分清静态代码块,构造代码块,构造函数执行的先后顺序。概念性的东西比较多,应当结合代码多加理解。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值