黑马程序员技术交流社区

标题: JAVA中的面向对象知识 [打印本页]

作者: 我是刘通    时间: 2015-10-9 20:39
标题: JAVA中的面向对象知识
面向对象:
特点:
1.    将复杂的事情简单化;
2.    面向对象将以前过程中的执行者,变成了指挥者;
过程和对象在我们的程序中是如何体现的呢?过程其实就是函数;对象是将函数等一些内容进行了封装。
匿名对象使用场景:
1:当对方法只进行一次调用的时候,可以使用匿名对象。
2:当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。

在类中定义其实都称之为成员。成员有两种:
1:成员变量:其实对应的就是事物的属性。
2:成员函数:其实对应的就是事物的行为。
所以,其实定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。

开发时,记住,属性是用于存储数据的,直接被访问,容易出现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的访问方法

重载:
重载的定义是:在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了。
如何区分重载:当函数同名时,只看参数列表。和返回值类型没关系。

如何区分重载:当函数同名时,只看参数列表。和返回值类型没关系。

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

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

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

构造函数和一般函数有什么区别
1:两个函数定义格式不同。
2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
    一般函数,是对象创建后,需要调用才执行,可以被调用多次。
什么时候使用构造函数呢?
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
继承
好处:
1:提高了代码的复用性。
2:让类与类之间产生了关系,提供了另一个特征多态的前提。

父类的由来:其实是由多个类不断向上抽取共性内容而来的。
java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。

单继承:一个类只能有一个父类。
多继承:一个类可以有多个父类。
抽象类: abstract
抽象:不具体,看不明白。抽象类表象体现。
在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。
抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。

抽象类的特点:
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

Object:所有类的直接或者间接父类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。

具体方法:
1,boolean equals(Object obj):用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
    public boolean equals(Object obj){
        if(!(obj instanceof Person))
            return false;
        Person p = (Person)obj;
        return this.age == p.age;
    }
2,String toString():将对象变成字符串;默认返回的格式:类名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())
    为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
    public String toString(){
        return "person : "+age;
    }
3,Class getClass():获取任意对象运行时的所属字节码文件对象。
4,int hashCode():返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。

通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容。


当内部类定义在外部类中的成员位置上,可以使用一些成员修饰符修饰 private、static。
1:默认修饰符。
直接访问内部类格式:外部类名.内部类名 变量名 =  外部类对象.内部类对象;
Outer.Inner in = new Outer.new Inner();//这种形式很少用。
    但是这种应用不多见,因为内部类之所以定义在内部就是为了封装。想要获取内部类对象通常都通过外部类的方法来获取。这样可以对内部类对象进行控制。
2:私有修饰符。
    通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。
3:静态修饰符。
    如果内部类被静态修饰,相当于外部类,会出现访问局限性,只能访问外部类中的静态成员。
    注意;如果内部类中定义了静态成员,那么该内部类必须是静态的。

内部类编译后的文件名为:“外部类名$内部类名.java”;

为什么内部类可以直接访问外部类中的成员呢?
那是因为内部中都持有一个外部类的引用。这个是引用是 外部类名.this
内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。
当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。

体现:父类引用或者接口的引用指向了自己的子类对象。//Animal a = new Cat();
多态的好处:提高了程序的扩展性。
多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
多态的前提:
    1:必须要有关系,比如继承、或者实现。
    2:通常会有覆盖操作。

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

class 毕姥爷{
    void 讲课(){
        System.out.println("企业管理");
    }
    void 钓鱼(){
        System.out.println("钓鱼");
    }
}
class 毕老师 extends 毕姥爷{
    void 讲课(){
        System.out.println("JAVA");
    }
    void 看电影(){
        System.out.println("看电影");
    }
}
class {
    public static void main(String[] args) {
        毕姥爷 x = new 毕老师(); //毕老师对象被提升为了毕姥爷类型。
//        x.讲课();
//        x.看电影();  //错误.
        毕老师 y = (毕老师)x; //将毕姥爷类型强制转换成毕老师类型。
        y.看电影();//在多态中,自始自终都是子类对象在做着类型的变化。
    }
}
instanceof
如果想用子类对象的特有方法,如何判断对象是哪个具体的子类类型呢?
可以可以通过一个关键字 instanceof ;//判断对象是否实现了指定的接口或继承了指定的类

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



作者: 刘德坤    时间: 2015-10-9 20:54
                           
作者: 我是刘通    时间: 2015-10-9 21:57
我感觉我写的还不算太透彻
作者: 我是刘通    时间: 2015-10-9 22:01
不要着急我还有很多东西没发出来呢
作者: 我是刘通    时间: 2015-10-9 22:02
好的吧  我承认我的帖子不够吸引人  
作者: 我是刘通    时间: 2015-10-9 22:17
我一定会更新的即使没有人给我评论 我也会自己在这一直默默支持者我自己
作者: 我是刘通    时间: 2015-10-9 22:19
我一定会更新的即使没有人给我评论 我也会自己在这一直默默支持者我自己
作者: 我是刘通    时间: 2015-10-9 22:24
我一定会更新的即使没有人给我评论 我也会自己在这一直默默支持者我自己
作者: 我是刘通    时间: 2015-10-9 22:25
刘德坤 发表于 2015-10-9 20:54

哥们能多来几条吗
作者: 迷茫不堪的年纪    时间: 2015-10-9 22:53
其实不用担心的,你写的挺好,如果只为了让更多人看到的话, 你可以分三次发这个,每次不要太长,因为很多看的会审美疲劳。虽然我写帖子有时候写起来也很长。。支持自己,挺好的!早点休息!
作者: lvcj    时间: 2015-10-9 23:01
面向对象特点:更符合人们的思考习惯
作者: 小馒头的向日葵    时间: 2015-10-9 23:17
好牛气!!果然是大神!!
作者: 小馒头的向日葵    时间: 2015-10-9 23:20
果然是大神!厉害!
作者: 小馒头的向日葵    时间: 2015-10-9 23:22
果然是大神!厉害!
作者: 删''情    时间: 2015-10-9 23:24
蒽蒽,,,总结的不错,,给个赞,,,
作者: chenguoyu520    时间: 2015-10-9 23:25
哈哈,我看的后面的部分,从线程那儿开始的,前面的部分以前学过都忘的差不多了,不过后面复习一下就行啦
作者: Meitan    时间: 2015-10-10 17:46
感觉好多啊
作者: 915816106    时间: 2015-10-10 21:32
嗯嗯,不错
作者: ma5074    时间: 2015-10-10 21:34
总结的蛮全面的  赞
作者: blensmile    时间: 2015-10-10 21:36
大神谢谢分享~写的挺详细~萌萌哒~
作者: guaiqiaorener    时间: 2015-10-10 21:50
谢谢分享
作者: 李金龙2015    时间: 2015-10-10 22:32
总结的好全面 , 赞一个
作者: 如梦丶似幻    时间: 2015-10-10 22:56
谢谢分享~~~~~~~
作者: Sniper-L    时间: 2015-10-10 22:59
不错,赞一个,就是有点长
作者: kuki_zero    时间: 2015-10-10 23:07
好棒好棒  
作者: 神马才是黑马    时间: 2015-10-10 23:10
不错。。。。
作者: ertrtesr    时间: 2015-10-11 00:18
挺好的,写的
作者: Rzzz    时间: 2015-10-11 02:07
总结的不错,学了后面忘了前面...看一遍帖子又全部记起来了    学习就是不断忘记,记忆,忘记的过程...次数多了  印象自然就深了..
作者: lingyins    时间: 2015-10-11 09:25
哥们别着急,黑马币没那么重要,别灌水,灌水分分钟给你清零,如果你正在就读基础班,你就每天晚上 上下论坛,回复下活动贴,没有就随便回复几个,等你学完了,黑马币不会少的。
作者: 挽子青丝    时间: 2015-10-11 10:55
get了。总结的不错
作者: 情深不及久伴    时间: 2015-10-11 12:09
可以,,可以
作者: language    时间: 2015-10-11 14:01
mark~学到再看,支持下~
作者: 我是刘通    时间: 2015-10-12 20:32
小馒头的向日葵 发表于 2015-10-9 23:17
好牛气!!果然是大神!!

加个好友行吗 1666874683
作者: 我是刘通    时间: 2015-10-12 20:33
ma5074 发表于 2015-10-10 21:34
总结的蛮全面的  赞

加个好友行吗  1666874683
作者: 我是刘通    时间: 2015-10-12 20:35
迷茫不堪的年纪 发表于 2015-10-9 22:53
其实不用担心的,你写的挺好,如果只为了让更多人看到的话, 你可以分三次发这个,每次不要太长,因为很多 ...

谢谢你   能加个好友吗  1666874683
作者: 我是刘通    时间: 2015-10-12 20:36
lingyins 发表于 2015-10-11 09:25
哥们别着急,黑马币没那么重要,别灌水,灌水分分钟给你清零,如果你正在就读基础班,你就每天晚上 上下论 ...

我这真没有灌水  你怎么这样呢   喷子
作者: SF_NEVERMORE    时间: 2015-10-12 20:37
谢谢楼主分享,已经复制粘贴。
作者: lingyins    时间: 2015-10-12 22:59
我是刘通 发表于 2015-10-12 20:36
我这真没有灌水  你怎么这样呢   喷子

有点意思,我何时喷你了?喷子?
作者: nesaylo717    时间: 2015-10-12 23:04
好吧,顶一个吧..
作者: 小鹿    时间: 2015-10-13 09:09
又让我复习了一遍!  谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2