美文网首页
Java面向对象

Java面向对象

作者: CharmingWong | 来源:发表于2017-04-30 10:01 被阅读42次

    今天就来讲讲面向对象的那些东西,这些知识点都是学习Java面向对象编程的基础,是必不可少的,它有可能出现在实际的项目开发中,也有可能出现在程序员面试中。千万别小看这些看起来很基础的概念,拿出去问一个学Java很久的人还不一定会,并不是说它有多难,而是很多人不太注重这些概念性知识。

    俗话说,技多不压身,更何况是基础呢!

    下面尽量挑一些面向对象中常见的概念来讲讲,可能不太全

    废话不多说,开始吧!

    什么是面向对象,什么是面向过程?

    面向对象:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。

    面向过程:自顶向下顺序执行,逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。程序流程在写程序时就已决定。

    面向对象基本概念:对象和类

    对象:对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

    对象的状态和行为:对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

    类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

    类的结构:在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。 ①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。 ②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。

    消息和方法:对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体

    面向对象软件开发的优点

    代码开发模块化,更易维护和修改。
    代码复用。
    增强代码的可靠性和灵活性。
    增加代码的可理解性。

    面向对象编程的三大特性

    封装:封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
    继承:当一个类的属性与行为与现有的类相似,属于现有类的一种时,这个类可以定义为现有类的子类。换成相反的角度来看,如果多个类具有相同的属性和行为,我们可以抽取出共性的内容定义为父类,这时再创建相似的类时只要继承父类定义即可。
    多态:多态的特征是表现出多种形态,具有多种实现方式。或者多态是具有表现多种形态的能力的特征。或者同一个实现接口,使用不同的实例而执行不同的操作。例如,系统由使用人定义了一个人的对象Person。然后实际登录系统的有几种情况,一种是系统管理人员,一种是客户,一种是系统的用户。我们在前面只定义一个人来使用系统,而后台又会集体判断使用系统的是什么人,这就是多态。

    接口和抽象类的区别

    接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

    抽象类:使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。

    语法层面:

    接口用interface声明,抽象类用abstract class生命

    抽象类的抽象方法要加上abstract,接口则可以省略

    抽象类的变量可以用多种修饰符修饰,接口的变量只能声明为public static final

    抽象类包含普通方法和抽象方法,接口只能包含抽象方法

    抽象类可以有构造方法,接口没有构造方法

    抽象类和接口都不能直接实例化

    抽象类如果包含main方法可以被调用,接口则不行

    一个子类可以实现多个接口,但只可以继承一个抽象类

    设计层面: 抽象类往往用来表示在对问题领域进行分析,设计中得出的抽象概念,是对一系列看上去不同,但本质上相同的具体概念的抽象,即对类的抽象,而接口是对行为的抽象。抽象类是对整个类进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

    Java修饰符访问权限
    private:私有成员,仅类的内部访问。
    protected:保护成员,在类内部或者子类中可以访问。
    public:公共成员,任何地方都可以访问,没有限制。
    缺省;仅在包内可以访问。

    内部类

    java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。

    内部类的共性: (1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。 (2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。 (3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

    成员内部类:
    class Outer {
    class Inner{}
    }
    编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。

    方法内部类:
    class Outer {
    public void doSomething(){
    class Inner{
    public void seeOuter(){
    }
    }
    }
    }
    (1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
    (2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
    因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

    匿名内部类:
    public class Car {
    public void drive(){
    System.out.println("Driving a car!");
    }
    public static void main(String[] args) {
    Car car = new Car(){
    public void drive() {
    System.out.println("Driving another car!");
    }
    };
    car.drive();
    }
    }
    匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
    ·只用到类的一个实例 。
    ·类在定义后马上用到。
    ·类非常小(SUN推荐是在4行代码以下)
    ·给类命名并不会导致你的代码更容易被理解。
    在使用匿名内部类时,要记住以下几个原则:
    ·匿名内部类不能有构造方法。
    ·匿名内部类不能定义任何静态成员、静态方法。
    ·匿名内部类不能是public,protected,private,static。
    ·只能创建匿名内部类的一个实例。
    ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
    ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

    静态嵌套类:
    静态内部类中可以定义静态或者非静态的成员。
    从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
    静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。

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

    在类中的位置不同
    成员变量类中方法外
    局部变量方法内或者方法声明上
    在内存中的位置不同
    成员变量堆内存
    局部变量栈内存
    生命周期不同
    成员变量随着对象的存在而存在,随着对象的消失而消失
    局部变量随着方法的调用而存在,随着方法的调用完毕而消失
    初始化值不同
    成员变量有默认的初始化值
    局部变量没有默认的初始化值,必须先定义,赋值,才能使用。

    构造方法的特点和注意事项

    构造方法的特点:
    方法名与类名相同
    没有返回值类型,连void都没有
    没有具体的返回值
    构造方法注意事项:
    如果我们没有给出构造方法,系统将自动提供一个无参构造方法

    如果我们给出了构造方法,系统将不再提供默认的无参构造方法。

    注意:这个时候,如果我们还想使用无参数构造方法,就必须自己给出。建议永远自己给出无参数构造方法。

    欢迎关注微信公众号,Charming写字的地方

    qrcode_for_gh_f3a20df4260d_258.jpg

    相关文章

      网友评论

          本文标题:Java面向对象

          本文链接:https://www.haomeiwen.com/subject/qwottxtx.html