面向对象的基本概念以及用法以及集合

本文详细介绍了Java中的面向对象基本概念,包括封装、继承、多态,并深入讲解了static关键字的使用以及成员变量与局部变量的区别。此外,文章讨论了main方法的静态特性、访问控制符以及构造方法、成员方法和代码块。接着,文章阐述了继承的优势和特点,封装的意义,以及this关键字的应用。最后,简要提到了匿名内部类、final、finally、finalize的区别以及重载和覆盖的区别。Java集合框架中的HashSet、ArrayList和LinkedList也在文中进行了比较,分析了它们各自的特点和使用场景。
摘要由CSDN通过智能技术生成

  

   一、什么是面向对象

        面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点。

面向对象的特征

1、封装:就是把属性私有化,提供公共方法访问私有对象。举个简单的例子,我们去Apple店里买个iPhoneX,我们不需要知道它是怎么制造的,我们只需要知道它能用来打电话,上网和用来装B就行了。对于程序设计,用户只需要知道类中某个方法实

2、继承:当多个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它类继承这个父类。继承后子 类自动拥有了父类的属性和方法,比如猫,狗,熊猫他们共同的特征都是动物,有颜色,会跑,会叫等特征。我们可以把这些特征抽象成我一个Animal类(也就是父类)。然而他们也有自己独特的特性,比如猫会抓老鼠,喵喵叫,熊猫有黑眼圈,能吃竹子,狗会汪汪。于是我们就根据这些独特的特征分别抽象出来Cat,Dog,Panda类等。他们拥有Animal类的一般属性和方法,也拥有自己特有的某些属性和方法。

3、多态:简单来说就是“一种定义,多种实现”。同一类事物表现出多种形态。Java语言中有方法重载和对象多态两种形式的多态

     方法重载:在一个类中,允许多个方法使用同一个名字,但是方法的参数不同,完成的功能也不同

      对象多态:子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同

4、抽象:抽象是从许多事物中,舍弃个表的,非本质的属性,抽取出共同的,本质的属性的过程。例如教师,学生和工人,他们共同的特质是人类,既然是人类就有共同的属性:性别,年龄,身高,体重等。抽象的过程就是比较的过程,通过比较找出事物之间的共同属性,通过比较区分本质。

stati修饰符:

       static关键字的中文含义是静态的意思。使用static修饰的成员变量,常量,方法和代码分别称为静态变量,静态常量,静态方法,静态代码块,它们统称为静态成员。静态成员归整个类所有,不依赖特定的实例,被类的所有实例所共享的。只要被JVM加载就可以根据类名在全局数据区内找到

二、static关键字注意事项

•    在静态方法中是没有this关键字的

•    静态方法只能访问静态的成员变量和静态的成员方法

类的成员变量分为两种:

1、实例变量(ps:也就是没有被static关键字修饰的变量)

2、静态变量

 三、 静态变量和成员变量的区别(1、) 所属不同•     静态变量属于类,所以也称为为类变量•     成员变量属于对象,所以也称为实例变量(对象变量)(2、)内存中位置不同•     静态变量存储于方法区的静态区•     成员变量存储于堆内存(3、) 内存出现时间不同•     静态变量随着类的加载而加载,随着类的消失而消失•     成员变量随着对象的创建而存在,随着对象的消失而消失(4、) 调用不同•     静态变量可以通过类名调用,也可以通过对象调用•     成员变量只能通过对象名调用

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

五、main方法是静态的l public static voidmain(String[] args) {}•    public 被jvm调用,访问权限足够大。•    static 被jvm调用,不用创建对象,直接类名访问•    void被jvm调用,不需要给jvm返回值•    main 一个通用的名称,虽然不是关键字,但是被jvm识别•    String[] args以前用于接收键盘录入的

六、访问控制符

     Java语言中,访问修饰符可以出现在类,成员变量,成员方法以及构造方法前,用来控制权限。Java提供了4种级别的访问控制

 public   权限最宽    修饰的类,属性,方法不仅可以跨类还可以跨包访问private  权限最狭隘  修饰的类,属性,方法只能被该类的对象访问,即使是其子类也不能访问! 做的很绝-.-protected  介于public和private之间 修饰的类,属性,方法能被该类的对象,本包,子类访问(即使没和父类在同一包中)default   默认访问模式,只向同一个包中的类公开,即同包访问。

七、   成员变量

•    构造方法

•    成员方法

l 给成员变量赋值的方式

l  无参构造方法+setXxx()

l  带参构造方法

八、代码块l 代码块•    在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。•    局部代码块•   在方法中出现;限定变量生命周期,及早释放,提高内存利用率

•    构造代码块•   在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行

•    静态代码块在类中方法外出现,加了static修饰•   在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且值执行一次。

 静态代码块,构造代码块,构造方法的执行顺序?

九、继承l 继承概述•    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。•    通过extends关键字可以实现类与类的继承      •   class 子类名  extends 父类名{} •    单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。•    有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。 继承的好处l 继承的好处•    提高了代码的复用性•   多个类相同的成员可以放到同一个类中

•    提高了代码的维护性•   如果功能的代码需要修改,修改一处即可

•    让类与类之间产生了关系,是多态的前提   • 其实这也是继承的一个弊端:类的耦合性很强让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。原则:低耦合,高内聚。耦合:类与类的关系内聚:自己完成某件事情的能力

Java中继承的特点l  Java只支持单继承,不支持多继承。•     一个类只能有一个父类,不可以有多个父类。l Java支持多层继承(继承体系)

十、封装l 封装概述•    是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。l 好处:•     隐藏实现细节,提供公共的访问方式•     提高了代码的复用性•     提高安全性。l  封装原则:•     将不需要对外提供的内容都隐藏起来。•     把属性隐藏,提供公共方法对其访问。

private关键字l  private关键字:•     是一个权限修饰符。•    可以修饰成员(成员变量和成员方法)•    被private修饰的成员只在本类中才能访问。l private最常见的应用:•    把成员变量用private修饰•    提供对应的getXxx()/setXxx()方法•     一个标准的案例的使用

this关键字

l this:代表所在类的对象引用

l 注意:

•    方法被哪个对象调用,this就代表那个对象

十一、匿名内部类

l 就是内部类的简化写法。

l 前提:存在一个类或者接口

•     这里的类可以是具体类也可以是抽象类。

l 格式:

new类名或者接口名(){重写方法;}

final, finally, finalize的区别

①、final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

②、finally是异常处理语句结构的一部分,表示总是执行。

③、finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

Overload和Override的区别

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

                                      JAVA集合

一、HashSet类hashSet用Hash算法来存储集合中的元素,具有很好的存取和查找性能。特点:1. 无序

2. 不是同步的

3. 集合元素值可为null

4. 不允许包含相同的元素存入一个元素:HashSet调用该对象的hashCode()方法得到hashCode值,根据该hashCode值确定该对象的存储位置。访问一个元素:HashSet先计算该元素的hashCode值,然后直接到该hashCode值对应的位置去取出该元素。如果元素相同则添加失败add()返回false。HashSet集合判断两个元素相同的标准是两个对象equals()方法比较相等,并且hashCode值也相等。如果两个对象的hashCode值相同,equals()返回false时,会在同一个位置用链式结构来保存。导致性能下降。

                ArrayList和LinkedList比较

                1、ArrayList和LinkedList是非线程安全的。如果不考虑到线程的安全因素,一般用ArrayList和LinkedList效率比较高。

2.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
3.如果集合中的元素的数目大于目前集合数组的长度时,ArrayList增长率为目前数组长度的50%.
3.如果查找一个指定位置的数据,ArrayList使用的时间是相同的,花费时间为O(1),而LinkedList需要遍历查找,花费时间为O(i),
4.而如果移动、删除一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑使用LinkedList,因为它移动一个指定位置的数据所花费的时间为0(1)。
5.对于在指定位置插入数据,LinedList比较占优势,因为ArrayList要移动数据。
 

                 二、集合框架接口和其特点:

                 1:Collection接口是一组允许重复的对象。

                   2:Set接口承Collection,无序但不允许重复。

                   3:List接口继承Collection,有序但允许重复,并引入位置下标。

                   4:Map接口既不继承Set也不继承Collection,是键值对。

   下面详细介绍这几种集合框架接口

              Collection接口:

           概念: Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。

    Iterator接口:主要用来枚举集合中的元素。 可理解成集合的查寻组件。迭代器又称枚举器,就是把集合中的元素一个个枚举出来,就相当于拿着学生的花名册一个个点名。
    组操作:Collection接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。

      boolean contains( Object obj )                 ----------判断其中是否含有指定元素
      boolean addAll( Collection collection )     ----------取并集
      void clear()                                               ----------移除此 collection 中的所有元素
      void removeAll( Collection collection )     ----------移除此 collection 中那些也包含在指定 collection 中的所有元素
      void retainAll( Collection collection )        ----------取交集

Set接口:

   概念:按照定义,Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是Collection中现成的,没有引入新方法。

             具体的Set实现类依赖添加的对象的equals()方法来检查等同性。

  HashSet类和TreeSet类:
        “集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。在更多情况下,会使用HashSet存储重复自由的集合。考虑到效率,添加到HashSet的对象需要采用恰当分配散列码的方式来实现hashCode()方法。当需要从集合中以有序的方式抽取元素时,TreeSet实现会有用处。为了能顺利进行,添加到TreeSet的元素必须是可排序的。
    

List接口:

  概念:List接口继承了Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。

            面向位置的操作包括插入某个元素或Collection的功能,还包括获取、除去或更改元素的功能。在List中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。

常用的方法:

void add(int index,E element)    将element放在index位置上 index的范围:0~size()
boolean addAll(int index,Collection<?extends E>c)     将指定集合中所有元素增加到当前集合的index的位置
E remove(int index)        用于删除指定位置的元素,并返回该元素
E set(int index,E element)        用于将当前集合中index位置的元素element赋值
E get(int index)        用于返回当前集合中下标为index位置的元素
List<E> subList(int fromIndex,int toIndex)        
    用于获取当前集合中从fromIndex(包含)到toIndex(不包含)之间的部分的视图
    内存空间还是同一份,一改都改。
 

    void add(int index, Object element)                      ----------加到指定位置
    boolean addAll(int index, Collection collection)    ----------把collection里的元素全部加进去,返回布尔型
    Object get(int index)                                             ----------获取指定位置的元素
    int indexOf(Object element)                                  ---------- 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1
    int lastIndexOf(Object element)                            ----------返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1
    Object remove(int index)                                      ----------移除此列表中指定位置上的元素
    Object set(int index, Object element)                   ----------替换指定位置的元素
    List subList(int fromIndex, int toIndex)
注意:

   1)使用List(如ArrayList)时,不会自动调用hashCode()方法。因为在List中,重复了就重复了,不需判断,保证唯一性。
   2)List中添加了下标index的功能,这样对List的修改可以利用set方法对指定位置的元素直接进行替换,不需要象Set那么复杂(要转换成数组才能修改,之后还要转换回去)。
   3)Collection用Iterator迭代器,而List可以用ListIterator列表迭代器。前者只能next(),后者不但包含next()方法,还包含previous()方法。因此,如果要用List做类似书的翻页功能,不但可以向后翻,还可以向前翻。

        在“集合框架”中有两种常规的List实现:ArrayList和LinkedList。 如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供了可选的集合。但如果要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么LinkedList实现更好。

Map接口:

   概念: Map接口不是Collection接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。

    Object put(Object key,Object value)  ---------新增or修改
    Object remove(Object key)                ---------通过key修改
    void putAll(Map mapping)                 ----------把一个map中的元素加入进去
    void clear()                                        ----------从列表中移除所有元素
    Object get(Object key)                      ----------通过key值或的value值
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值