黑马程序员——Java基础---面向对象<一>

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


面向对象


1.1、概念

面向对象是相对面向过程而言,面向对象和面向过程都是一种思想
面向过程:(强调功能行为)

强调的是功能行为。代表语言:C语言。

面向对象:(强调对象

 将功能封装进对象,强调具备了功能的对象。代表语言:Java、C++、C#。

1.2、优点

1:将复杂的事情简单化。
2:面向对象将以前的过程中的执行者,变成了指挥者。
3:面向对象这种思想是符合现在人们思考习惯的一种思想。

1.3、完成过程

    1. 明确所需的功能,找到具有所需的功能的对象。
    2. 如果该对象不存在,那么创建一个具有所需功能的对象。
    3. 调用相应的功能方法,完成功能

1.4、面向对象的特征:

1.4.1、封装:
1、含义:
隐藏对象的属性和实现细节,仅对外提供公共访问方式。如对于属性 xxx,
可以使用setXXX(),getXXX()对其进行操作。

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

3、封装原则:
将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
1.4.2、继 承
1、含义
利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是
复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需

2、好处
1)提高了代码的复用性。
2)让类与类之间产生了关系,提供了另一个特征多态的前提

3、基本原则
只支持单继承,但对于一个继承体系的使用,可以查阅顶层父类中的内容,创建最底层子类的对象。
A继承B  B继承C  C继承D,那么A就可以继承到 D的方法。

4、继承的细节:
1)什么时候使用继承呢?
当类与类之间存在着所属关系时,才具备了继承的前提。英文书中,所属关系:" is a "
注意:
不要仅仅为了获取其他类中的已有成员进行继承。
所以判断所属关系,可以简单看,如果继承后,被继承的类中的功能,都可以被该子类所具备,
那么继承成立。如果不是,不可以继承。

2)在方法覆盖时,注意两点:
1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。
否则,编译失败。
2:覆盖时,要么都静态,要么都不静态。 (静态只能覆盖静态,或者被静态覆盖)
弊端:
打破了封装性。对于一些类,或者类中功能,是需要被继承,或者复写的。
1.4.3、多态
1、含义
函数本身就具备多态性,某一种事物有不同的具体的体现。

2、体现
父类引用或者接口的引用指向了自己的子类对象。Animal a = new Cat(); 

3、好处
提高了程序的扩展性。

4、思想上
多态的出现思想上也做着变化:以前是创建对象并指挥对象做事情。有了多态以后,我们可以找到
对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。

5、多态的前提:
1)必须要有关系,比如继承、或者实现。
2)通常会有覆盖操作。

6、弊端
当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,
不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)

如果想用子类对象的特有方法,如何判断对象是哪个具体的子类类型呢?
可以可以通过一个关键字 instanceof判断对象是否实现了指定的接口或继承了指定的类

格式:<对象 instanceof 类型> ,判断一个对象是否所属于指定的类型。
Student instanceof Person = true;
//student继承了person类

2.0 关系

java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义,
也就是对象的抽象描述。对象即是该类事物实实在在存在的个体。

2.0、类与对象

2.1、类
过程和对象在我们的程序中是如何体现的呢?过程其实就是函数;对象是将函数等一些内容进行了封装。

1、 类的定义

生活中描述事物无非就是描述事物的属性和行为。如:人有身高,体重等属性,有说话,打球等行为。
Java中用类class来描述事物也是如此。
属性:对应类中的成员变量。
行为:对应类中的成员函数。

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

在类中定义其实都称之为成员。成员有两种:
1:成员变量:其实对应的就是事物的属性。
2:成员函数:其实对应的就是事物的行为。

所以,定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。

2、匿名对象

1:当对方法只进行一次调用的时候,可以使用匿名对象。
2:当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。

例:

class Car{
    int num;
    String color;
}
class CarDemo{
       public static void main(String[] args){
             //匿名对象可以作为实际参数进行传递
            show(new Car());
      }

       public static void show(Car c){
            c. num = 3;
            c. color = "black" ;
            System.out.println("function show is running!" );
            System.out.println(c.num + "..." + c. color);
      }
}
// 3...black

3、变量

1)成员变量:

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

2)局部变量:

1. 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2. 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3. 局部变量没有默认初始化值。

4、 创建对象,使用对象
1)例:

//对Person这类事物进行描述
class Person
{
     //成员变量
     private String name= "";
     private int age= 0;
     //初始化
     Person(String name,int age){
     this.name=name;
     this.age=age;
     }
     //成员方法
     void show()
     {
        //输出变量的值
       System.out.println("name= " +name+"...age= " +age);
     }
}

class PersonDemo
{
     public static void main(String[] args)
     {
        //通过new关键字,建立对象
        //p就是一个类类型的引用变量,指向了该类的对象
        Person p = new Person("zhangsan",24);
        //输出成员变量的属性值
        System.out.println(p.age );
        //通过对象.成员的形式来使用对象的功能
        p.show();
     }
}

/*只要是用new操作符定义的实体就在会堆内存中开辟一个新的空间,并且每一个对象中都有一份属于自己的属性。
    通过对象.对象成员的方式操作对象中的成员,对其中一个对象的成员进行了修改,和另一个对象没有关系。*/

5、函数

5.1、构造函数
用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
特点:
1)该函数的名称和所在类的名称相同。
2)不需要定义返回值类型。
3)该函数没有具体的返回值。
记住:所有对象创建时,都需要初始化才可以使用。

注意事项
一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。

5.2、构造函数和一般函数的区别
1)两个函数定义格式不同。
2)构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
一般函数,是对象创建后,需要调用才执行,可以被调用多次。

5.3、使用
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

5.4、构造代码块和构造函数的区别
1)构造代码块
是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。
2)构造函数
是给与之对应的对象进行初始化。它具有针对性。

6、其他
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),
然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值