面向对象,集合,反射,IO

本文深入探讨了Java编程中的面向对象概念,包括面向对象的特性:封装、继承、多态和接口。接着,介绍了集合框架,如List、Set、Map及其常见实现。进一步讲解了IO流的基本概念和分类。最后,讨论了反射机制,包括其定义、用途、相关类以及在Spring中的应用。
摘要由CSDN通过智能技术生成

一、面向对象

什么是面向过程

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了(百度百科)。

C语言是典型的面向过程的编程语言。在C语言中,你就是上帝(主函数就是上帝意志的体现…),你把想做的事“封装”成一个一个函数模块,然后在主函数中通过调用不同的函数完成不同的功能,最后达到你想到的效果(得到你想要的输出)。

如:定义一个 Student 结构体,然后定义一个study函数。在主函数中调用study函数,打印“XXX is studying ! ”语句。

有人说,面向对象就是结构体里面包含了函数,好像对也好像不对:面向对象编程确实把数据(属性)和函数(方法)放到了一块,但是它还有许许多多面向过程编程没有的特性。

什么是面向对象

面向对象就是是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(百度百科)。

JAVA是典型的面向对象编程语言之一。在JAVA(或者说面向对象编程语言)中,你还是上帝,但是你是一个“简政放权”了的上帝。你创建了一个个对象,然后这些对象干这干那的。

如:创建一个Student对象,然后这个Student对象在主函数中调用自己study函数,打印“XXX is studying ! ”语句。

主函数还是上帝,但是study行为不是上帝发出的了,Student也不用被当做原材料了,study这个行为是Student主动发出的。

面向对象的特性

封装

对象把自己的数据(属性)隐藏起来,外部无论是访问还是赋值,都必须按照类自己定义规范来。

如,你可以在setter中,规范age的范围:

img

继承

当一个class(类),和一个已经定义好的class有“is-a”关系(如猫 Cat 是动物 Animal,Cat is Animal),那么 Cat 就可以继承 Animal。Animal 中的属性,Cat就可以使用了(达到了代码复用的效果)。

多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

以下是一个多态实例的演示,详细说明请看注释:

public class Test {
   
    public static void main(String[] args) {
   
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
   
      a.eat();  
        a.work();
        // 类型判断
        if (a instanceof Cat)  {
     // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();
            c.eatFish();
        } else if (a instanceof Dog) {
    // 狗做的事情 
            Dog c = (Dog)a;  
            c.work(); 
        }  
    }  
}
 
abstract class Animal {
     
    abstract void eat();  
    abstract void work();
}  
  
class Cat extends Animal {
     
    public void eat() {
     
        System.out.println("吃鱼");  
    }  
    public void work() {
     
        System.out.println("抓老鼠");  
    }  
    public void eatFish(){
   
         System.out.println("吃鱼");  
    }
}  
  
class Dog extends Animal {
     
    public void eat() {
     
        System.out.println("吃骨头");  
    }  
    public void work() {
     
        System.out.println("看家");  
    }  
}

接口

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

  • 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。

  • 一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。

  • 一个JAVA库中接口的例子是:Comparator 接口,这个接口代表了“能够进行比较”这种能力,任何类只要实现了这个Comparator接口的话,这个类也具备了“比较”这种能力,那么就可以用来进行排序操作了。

为什么要用接口
  • 接口被用来描述一种抽象。
  • 因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。
  • 接口也被用来实现解耦。

接口和抽象类的区别:

1.接口可以多继承,抽象类不能实现多继承。

2.接口只能定义抽象规则,抽象类既能定义抽象规则也可以提供已经实现的成员。

3.接口只包含方法,属性,索引器,事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性,字段,包含有实现的方法。

4.抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能。

5.接口着重于Can——Do关系类型,抽象类则偏重于IS——A式关系

6.接口多定义对象的行为,抽象类多定义对象的属性

二、集合

  • List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
  • Set下有HashSet,LinkedHashSet,TreeSet
  • List下有ArrayList,Vector,LinkedList
  • Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
  • Collection接口下还有个Queue接口,有PriorityQueue类

![](https://img-blog.csdn.net/20180612094225630?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ncXVuc2h1YWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

Connection接口:

List 有序,可重复
ArrayList

优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高

Vector

优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低

LinkedList

优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高

Set 无序,唯一
HashSet

底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()

基于HashMap实现

LinkedHashSet

底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一

基于LinkedHashMap实现

TreeSet

底层数据结构是红黑树。(唯一,有序)

  1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

TreeSet的应用,自定义排序规则

public class MyClass {
   
    public static void main(String[] args) {
   
        TreeSet<Student> ts
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值