黑马程序员-面向对象

------- android培训、 java培训、期待与您交流! ----------

面向对象概念

面向对象是一个与面向过程相对的概念。面向过程就是分析解决问题所需要的步骤,然后然后用函数把这一过程一步一步的实现出来,程序的重点集中在函数上面向对象是把问题分解成一个一个对象,建立对象的目的不是为了完成一个步骤,而是描叙某个事物在整个解决问题的步骤中的行为程序的重点集中在对象。Java也支持面向对象的三个特性:封装性(Encapsulation),继承性(Inheritance) ,多态性(Polymorphism)。

类(Class)与对象(Object)

类是对某一事物的描述,是抽象的,概念上的定义;对象是实际存在的该类事物的个体即实例(Instance)。类就像是设计图纸 对象就是一个个实物。
类的概念
类可以把数据和函数封装在一起,其中数据表示类的属性,函数表示类的行为,定义类就是定义类的属性和行为(方法)。
class{
            int age;//一个成员变量      该类的属性
            void  shout()                //该类的一个方法
       {
            int  age=60;//这是函数内部又重新定义的一个局部变量
            System.out.println("my age is "+age);
  }          
}
shout方法可以直接访问同一个类中的age变量。当加入int age=60;后语句访问的就不再是成员变量了而是局部变量age=60;

对象的产生与使用

想实现类的属性和行为,必须创建具体的对象,创建新对象的需用的关键字new和对象的类名如:Person P1=new Person();创建类对象就可以用“对象名.对象成员”的格式来访问成员了. 每个创建对象都有自己的生命周期,对象只能在有效的生命周期内被使用,当没有引用变量指向某一对象时这个对象就会变成垃圾。第一种情况:{Person P1=new person()……}当程序执行完大括号里的语句P1就无效了,Person对象就不在被任何话柄引用了。第二种情况:{Personp1=newPerson();p1=null;……}在执行完p1=null后;就是话柄还没有超出其作用域,但是它已经被赋值为空,不能只向任何对象,不在被引用变成了垃圾。第三种情况:{person p1=new person();person p2=p1;p1=null;……}执行完p1=null;产生的person对象不会变成垃圾,因为它仍然被p2引用,直到p2超出其作用域而无效。

对象的比较

两种对象比较的方式:“==”、equals()方法,“==”操作符用来比较两个变量的值是否相等,equals()方法用来比较两个对象的内容是否相等。变量的值和对象的内容是有区别的变量的值还包括它们占据的内存空间,而equals()是比较两个引用变量所指的对象的内容。

类的封装
通过将成员变量声明为私有的(private),再提供一个或多个公有(public)方法实现对该成员变量的修改或访问,这种方式称之为封装。
封装的目的:1)隐藏类的实现细节;2)让使用者只能通过事先制定好的方法去访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作;3)便于修改,增强代码的可维护性;4)可进行数据检查。

构造函数
构造方法在程序设计中非常有用,它可以为类的成员变量进行初始化工作,当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个类中加入我们要初始化的代码。它具有的特点:1)它具有与类相同的名称2)它不含返回值3)他不能再方法中用return语句返回一个值。
构造方法的重载和一般的重载一样,它们具有不同的个数或不同类型的参数,编译器就可以根据这一点判断出用new关键字产生对象时,该调用那个构造方法。
在Java中每一个类里都至少有一个构造方法。如果没有定义构造方法,系统会产生一个默认的构造方法。
this关键字

this主要要三种用法:

1、表示对当前对象的引用!

2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。

3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!

注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!


th   
Static关键字
Static关键字可用来修饰类的变量、方法和内部类。Static是静态的意思,也是全局的意思。它定义的东西属于全局和类相关,不与具体实例相关。也就是说它调用的时候,只是通过类名直接调用方法(ClassName.method()),而不是创建一个对象,再通过对象名调用方法(new ClassName().method())。一定要注意Static的变量、方法不可以通过对象来调用的。



static变量 
 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 
 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 
 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 

static
方法 
 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用thissuper关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!! 
 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract


内部类

面向对象程序中,可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
内部类的使用
1)当一个类中的代码要用到另一个类中的实例对象,而另一个类中的程序代码又要访问第一个类中的成员,这是将另外一个类作成第一个类的内部类。
2)一个类可以访问它的外部类成员但是反之不行,
3)如果用static修饰一个内部类,这个内部类就相当于是一个外部定义的类,所以static的内部类中可以声明static成员,但是非static的内部类中的成员是不能声明为static的,
4)内部类中可以通过创建对象从外部类之外被调用,只要将内部类声明为public即可。
5)在方法中定义的内部类只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,它的生命周期超出了方法的生命周期。





------- android培训、 java培训、期待与您交流! ----------

你可能感兴趣的:(java学习,编程,黑马程序员,面向对象)