JAVA学习总结(六)

一、集合

1、为什么需要集合

如果要将100个学生成绩存放到程序中,怎么做?

首先想到是数组

int[] scores=new int[100];

然而,长度是固定的,比如是101个学生成绩,这个数组就不能用了,越界。

另外如果只使用了10个,则另外90个都被浪费了。

总之:集合是数组的升级,长度是动态的,无需预定义

package com.zhangguo.chapter8.d1;

import java.util.ArrayList;
import java.util.List;

public class C1 {

    public static void main(String[] args) {

        //数组
        int[] scores=new int[100];
        //scores[200]=99;

        //泛型集合
        List<Integer> marks1=new ArrayList<Integer>();
        marks1.add(98);
        marks1.add(89);
        marks1.add(59);

        System.out.println(marks1.get(2)+1);
        //....

        //非泛型类型
        List marks2=new ArrayList();
        marks2.add(98);
        marks2.add(9.8);
        marks2.add("九十九");

        //非泛型有安全隐患
        System.out.println(Integer.parseInt(marks2.get(2)+"")+1);

    }

}

使用Array(数组)存储对象方面具有一些弊端,需要提前对数组进行容量大小的设定,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中,不要提前设置容量大小,存多少个就是多少个,无需提前定义。

数组是很常用的一种的数据结构,我们用它可以满足很多的功能,但是,有时我们会遇到如下这样的问题:

1、我们需要该容器的长度是不确定的。

2、我们需要它能自动排序。

3、我们需要存储以键值对方式存在的数据。

Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而数组长度固定,不能满足变化的要求。所以,java提供了集合。
特点
1. 长度可以发生改变
2. 只能存储对象
3. 可以存储多种类型对象

package com.zhangguo.chapter8.d1;

import java.util.ArrayList;
import java.util.List;

public class C1 {

    public static void main(String[] args) {

        //数组
        int[] scores=new int[100];
        //scores[200]=99;

        //泛型集合
        List<Integer> marks1=new ArrayList<Integer>();
        marks1.add(98);
        marks1.add(89);
        marks1.add(59);

        System.out.println(marks1.get(2)+1);
        //....

        //非泛型类型
        List marks2=new ArrayList();
        marks2.add(98);
        marks2.add(9.8);
        marks2.add("九十九");

        //非泛型有安全隐患
        System.out.println(Integer.parseInt(marks2.get(2)+"")+1);

    }

}

2、Java常用集合类型

1.父接口:

  Collection 集合
  Map 映射

2.Collection 集合

所有集合的根接口,Collection 表示一组对象,这些对象也称为 collection 的元素。
重点子接口:
  List:列表,每个元素都有索引号,可以重复
  Set:集,没有索引号,不许重复
  SortedSet:元素排序的接口,是set子接口

Set的实现类主要有:

  HashSet:(散列的集合,不保证顺序)

  TreeSet:(自然排序的,元素类型实现了Comparable接口),不允许null元素。

List的实现类主要有:

  ArrayList:动态数组,对于set(),get()效率高于LinkedList
  LinkedList:链表列表,对于remove(),add()效率高于ArrayList,扩展一些对首尾元素操作的方法addFirst(),removeLast(),pop()...

Map的实现类主要有:

  HashMap和TreeMap。

重点实现的类:

  ArrayList 动态数组
  LinkedList
  TreeSet

ArrayList和LinkedList的大致区别:

  1.ArrayList和LinkedList都存放对象的作用

  2.ArrayList是实现了基于动态数组(线性)的数据结构,LinkedList基于链表的数据结构。

  3.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  4.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

如何创建一个集合对象?

  Collection<元素的类型>  名称 = new 实现类的对象<元素的类型>();

ArrayList动态数组

  List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。

Collection常用方法

添加功能

boolean add(Object obj):向集合中添加一个元素

boolean addAll(Collection c):向集合中添加一个集合的元素

删除功能

void clear():删除集合中的所有元素

boolean remove(Object obj):从集合中删除指定的元素

boolean removeAll(Collection c):从集合中删除一个指定的集合元素

判断功能

boolean isEmpty():判断集合是否为空。

boolean contains(Object obj):判断集合中是否存在指定的元素。

boolean containsAll(Collection c):判断集合中是否存在指定的一个集合中的元素。

遍历功能

Iterator iterator():就是用来获取集合中每一个元素。

长度功能

int size():获取集合中的元素个数

交集功能

boolean retainAll(Collection c):判断两个集合中是否有相同的元素

把集合转换成数组

Object[] toArray():把集合变成数组。

List接口

List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

add方法用于添加一个元素到当前列表的末尾,也可以通过其重载形式指定添加的位置;

addAll方法用于添加一个集合到当前列表的末尾,主要用于批量添加;

remove方法用于删除列表中的一个元素,可以将需要删除的元素作为参数进行指定,也可以指定需要删除元素的下标;

removeAll方法用于一次删除多个元素,参数为集合,集合中包含需要删除的元素;

get 方法用于通过下标获取对应下标的元素;

set 方法用于修改对应下标的元素;

size 方法用于获得集合的长度;

另外,还有几个类似的方法:

clear 方法用于清除现有所有的元素;

contains 方法用来查找某个对象在不在列表之中;

ArrayList

ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。

ArrayList擅长于随机访问,ArrayList是非同步的。

示例:

package com.zhangguo.chapter8.d1;

import java.util.*;

public class ListDemo1 {

    public static void main(String[] args) {

        //定义list1集合,指定存放的数据类型,只能是引用类型
        List<Integer> list1=new ArrayList();

        //添加单个元素

        Integer n=88;
        list1.add(98);
        list1.add(99);
        list1.add(60);
        list1.add(n);

        //获得单个元素
        int e1=list1.get(0);  //98
        System.out.println("list1的第2个元素值为:"+list1.get(1));

        //获得集合长度
        System.out.println("长度为:"+list1.size());

        //遍历1
        for (Integer item : list1) {
            System.out.println("遍历:"+item);
        }

        //遍历2
        for (int i = 0; i < list1.size(); i++) {
            System.out.println(i+"="+list1.get(i));
        }

        //移除
        //将下标为0的元素移除,当前面的元素移除时后面补上
        list1.remove(0);
        System.out.println("list1的第1个元素值为:"+list1.get(0));
        //指定要移除的对象,把集合中的60移除
        list1.remove(n);
        //移除所有
        list1.clear();

        //获得集合长度
        System.out.println("长度为:"+list1.size());
    }

}

结果:

List基本操作

ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("Tom");
        arrayList.add("Jerry");
        arrayList.add("Micky");
        // 使用Iterator遍历元素
        Iterator<String> it = arrayList.iterator();
        while (it.hasNext()) {
            String str = it.next();
            System.out.println(str);
        }
        // 在指定位置插入元素
        arrayList.add(2, "Kate");
        // 通过索引直接访问元素
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
        List<String> subList = new ArrayList<String>();
        subList.add("Mike");
        // addAll(Collection<? extends String> c)添加所给集合中的所有元素
        arrayList.addAll(subList);
        // 判断是否包含某个元素
        if (arrayList.contains("Mike")) {
            System.out.println("Mike is include in the list");
        }

        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.addAll(arrayList);
        // 获取指定元素
        System.out.println(linkedList.get(4));
        // 获取第一个元素
        System.out.println(linkedList.getFirst());
        // 获取最后一个元素
        System.out.println(linkedList.getLast());
        // 获取并删除第一个元素
        System.out.println(linkedList.pollFirst());
        // 获取,但不移除第一个元素
        System.out.println(linkedList.peekFirst());

LIST操作二

package com.zhangguo.chapter8139.d1;

import java.util.*;

public class Collection01 {

    public static void main(String[] args) {

        //定义一个集合,只能存Integer
        List<Integer> marks=new ArrayList<Integer>();

        Integer k=75;

        //添加
        marks.add(10);  //0
        marks.add(90);  //1
        marks.add(37);
        marks.add(k);
        marks.add(58);
        marks.add(77);

        //取值
        System.out.println(marks.get(1));

        //长度
        System.out.println("个数:"+marks.size());

        //遍历
        System.out.println("遍历:");
        for (Integer n : marks) {
            System.out.println(n);
        }

        //根据索引删除
        marks.remove(3);
        //根据对象删除
        marks.remove(k);
        Integer d=null;
        for (Integer j : marks) {
            if(j==90){
                d=j;
                break;
            }
        }
        marks.remove(d);

        //修改
        marks.set(0, 9);  //将下标0对应的值修改为9

        //循环
        System.out.println("循环:");
        for (int i = 0; i < marks.size(); i++) {
            System.out.println(marks.get(i));
        }

        //删除所有
        marks.clear();
        System.out.println("个数:"+marks.size());

    }

}

Map与HashMap

Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。字典(Dictionary)

HashMap

以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。

key:键,唯一,钥匙,关键的

Map基本操作

HashMap<String, Integer> map = new HashMap<String, Integer>();
        // 向Map中添加元素
        map.put("Tom", 26);
        map.put("Jack", 18);
        map.put("Micky", 17);
        map.put("Kate", 15);
        // 根据Key获取Value
        System.out.println("Jack is " + map.get("Jack") + " years old");
        // 移除
        map.remove("Micky");
        // 遍历Map
        for (Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("name:" + entry.getKey() + " age:"
                    + entry.getValue());
        }
        // Key相同的元素将被覆盖
        map.put("Jack", 19);
        // 根据Key获取Value
        System.out.println("Jack is " + map.get("Jack") + " years old");
        // 判断是否包含某个Key
        if (map.containsKey("Tom")) {
            System.out.println(map.get("Tom"));
        }
        // 判断是否包含某个Value
        if (map.containsValue(26)) {
            System.out.println("The map include the value 26");
        }
        // 判断map是否为空
        if (!map.isEmpty()) {
            // 获取map大小
            System.out.println("The map‘s size=" + map.size());
        }
        // 获取Key的集合
        for (String str : map.keySet()) {
            System.out.println(str);
        }

        TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>();
        treeMap.putAll(map);
        // 输出内容按照key值排序
        for (Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println("name:" + entry.getKey() + " age:"
                    + entry.getValue());
            // name:Jack age:19
            // name:Kate age:15
            // name:Tom age:26
        }

        LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
        // 向Map中添加元素
        linkedHashMap.put("Tom", 26);
        linkedHashMap.put("Jack", 18);
        linkedHashMap.put("Micky", 17);
        linkedHashMap.put("Kate", 15);
        // 保持了插入的顺序
        for (Entry<String, Integer> entry : linkedHashMap.entrySet()) {
            System.out.println("name:" + entry.getKey() + " age:"
                    + entry.getValue());
            // name:Tom age:26
            // name:Jack age:18
            // name:Micky age:17
            // name:Kate age:15
        }
//包
package com.zhangguo.chapter8.d2;

import java.util.HashMap;
import java.util.Map;

//类
public class StudentClient {
    //方法  主方法 静态 数组
    public static void main(String[] args) {
        Stu s1=new Stu("201701","张学友","男");
        Stu s2=new Stu("201702","张汇美","女");
        Stu s3=new Stu("201703","张卫健","男");

        //创建一个Map集合 <>泛型 集合中只能存放学生对象
        //键是字符类型,值是Stu类型
        Map<String,Stu> students=new HashMap();

        //添加对象
        students.put(s1.no,s1);
        students.put(s2.no,s2);
        students.put("201703",s3);

        //取集合中key对应的元素
        students.get("201703").show();

        //遍历key
        for (String key : students.keySet()) {
            System.out.println("key:"+key);
        }

        //移除
        students.remove("201702");

        //遍历Value
        for (Stu s : students.values()) {
            s.show();
        }

        //移除所有
        students.clear();

        System.out.println("总个数:"+students.size());

    }
}

/**学生*/
class Stu
{
    //构造方法
    public Stu(String no,String name,String sex) {
        this.no=no;
        this.name=name;
        this.sex=sex;
    }
    //属性
    public String no;  //学号
    public String name;  //姓名
    public String sex;  //性别
    //方法
    public void show(){
        System.out.println("学号:"+no+" 姓名:"+name+" 性别:"+sex);
    }
}

Map操作二

//Student类
package com.zhangguo.chapter8139.d1;

/**学生类**/
public class Student {

    //构造方法
    public Student(String _no,String _name,String _sex,int _score) {
        this.no=_no;
        this.name=_name;
        this.sex=_sex;
        this.score=_score;
    }
    public Student() {
    }

    public String no;//学号
    public String name; //姓名
    public String sex;  //性别
    public int score;  //成绩

    @Override
    public String toString() {
        return  "学号:"+no+"\t姓名:"+name+"\t性别:"+sex+"\t成绩:"+score;
    }

}
//Map操作类

package com.zhangguo.chapter8139.d1;

import java.util.HashMap;
import java.util.Map;

public class Collection02 {
    public static void main(String[] args) {

        Student tom = new Student("201701", "张学友", "男", 98);
        //System.out.println(tom);

        Student rose = new Student("201702", "张汇美", "女", 69);
        //System.out.println(rose);

        //定义一个map,字典,key->String,value->Student
        Map<String,Student> stus=new HashMap<>();

        //添加
        stus.put(tom.no, tom);
        stus.put("201702", rose);
        stus.put("201703", new Student("201703","张国立","男",78));
        stus.put("201704", new Student("201704","张娜啦","女",60));
        stus.put("201709", new Student("201709","张铁林","男",35));

        //取值,引用类型传地址
        System.out.println(stus.get("201702"));
        Student jack=stus.get("201709");
        jack.score=36;

        //长度
        System.out.println("个数:"+stus.size());

        //遍历,所有key
        System.err.println("\n所有key:");
        for (String key : stus.keySet()) {
            System.out.println(key+":"+stus.get(key));
        }

        //是否存在某个对象
        System.out.println("是否存在key201702:"+stus.containsKey("201702"));

        //删除
        //根据key
        stus.remove("201702");

        //修改
        stus.put("201709", new Student("201709","张林铁","女",37));

        //遍历,所有value
        System.err.println("\n所有value:");
        for (Student v : stus.values()) {
            System.out.println(v);
        }

        //删除所有
        stus.clear();

        //长度
        System.out.println("个数:"+stus.size());

    }
}

TreeMap

  键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口

HashTable

  也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低

Set与HashSet

Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。

EnumSet

  是枚举的专用Set。所有的元素都是枚举类型。

HashSet

  HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。

Set基础操作

List<Integer> list = new ArrayList<Integer>();
           list.add(3);
           list.add(4);
           HashSet<Integer> hashSet = new HashSet<Integer>();
           hashSet.add(1);
           hashSet.add(3);
           hashSet.add(2);
           hashSet.add(6);
           // 重复元素将不能被添加
           hashSet.add(3);
           // 只要有元素被添加就返回true
           if (hashSet.addAll(list)) {
               System.out.println("Add success");
           }
           // 判断是否存在某个集合
           if (hashSet.containsAll(list)) {
               System.out.println("The hashSet is contain 3 and 4");
           }
           Iterator<Integer> it = hashSet.iterator();
           while (it.hasNext()) {
               System.out.print(it.next() + " ");
               // 1 2 3 4 6
               // 看结果是被排序了,HashSet按照Hash函数排序,Integer值的HashCode就是其int值
           }
           // 换转成数组
           Object[] integers = hashSet.toArray();
           for (int i = 0; i < integers.length; i++) {
               System.out.print((Integer) integers[i]);
           }
           //移除元素
           hashSet.remove(3);

           TreeSet<String> treeSet = new TreeSet<String>();
           treeSet.add("C");
           treeSet.add("A");
           treeSet.add("D");
           treeSet.add("B");
           for (Iterator<String> strIt = treeSet.iterator(); strIt.hasNext();) {
               System.out.print(strIt.next());
               // ABCD 按照字母顺序
           }
           LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
           linkedHashSet.add("C");
           linkedHashSet.add("A");
           linkedHashSet.add("D");
           linkedHashSet.add("B");
           for (Iterator<String> linkedIt = linkedHashSet.iterator(); linkedIt
                   .hasNext();) {
               System.out.print(linkedIt.next());
               // CADB 按照插入顺序
           }

TreeSet

  基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现。它是使用元素的自然顺序对元素进行排序,或者根据创建Set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

总结:

时间: 2024-11-05 20:39:03

JAVA学习总结(六)的相关文章

JAVA学习第六十四课 — 反射机制

   Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制,简单说:能动态获取类中的信息(类中所有),就是java的反射,也可以理解为对类的解剖 反射机制的基本应用场景:    比如一个程序的应用程序(TomCat),为了提高其扩展性,会对外暴露一个接口,在外部定义一个类实现这个接口,但是在应用程序内部无法new对象,所以应用程序会提供一个配置

Java学习(六)servlet 的引入

一.Servlet 1.了解Servlet Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者.Servlet运行于支持Java的应用服务器中.从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Se

JAVA学习笔记(六十一)- 反射Reflection

反射Reflection import java.lang.reflect.Modifier; /* * 反射Reflection * java.lang.Class类 */ public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通过对象getClass()方法 // 任意一个类的对象,都有一个getClass()方法 // 可以通过此获取获取当前对象的类型所

别样JAVA学习(六)继承下(2.1)Object类equals()

上一节继承下(一)我们进行抽象类.接口以及多态的学习, 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是都有 一个隐式的super()语句,它们是不是也都会去访问自己的 父类呢?其实是的,这个父类叫什么呢? 叫做Object类,传说JAVA对象中的上帝,哈哈. 1.定义 所有对象的超类,所有对象的直接后者间接父类. 肯定是所有对象都具备的功能. 随便定义一个类 class Demo{}除了隐式的构造方

别样JAVA学习(六)继承下(2.2)Object类toString()

接下来说完equals以后,我们学习接下来的toString(), Java又认为所有对象不光具有比较性, 还能使对象变成字符串被打印. 出现 以前前面显示的是数组,现在显示的是这个对象所属的类, 紧跟着是这个对象的哈希值,也就是所有的对象都有哈希值(内存地址). 接下来,修改ObjectDemoToString class类 class ObjectDemoToString { public static void main(String[] args) { Demo d1=new Demo(

Java学习(六)

面向对象 结构化编程和面向对象编程 在Java中,围绕要解决问题的对象来设计,我们通过类来描述对的属性和行为.把其中的一切都当成对象来描述 类与对象是相辅相成的,类是对象,对象是类的实例. 对象的每个属性被表示为类中的一个成员变量,对象的每个行为成为类中的一个方法 类 类是拥有共同属性的对象的集合.创建一个新的对象要用到关键字New,New+类名表示实例化一个新的对象,例如: public class Name(){} 建立一个其他的类 public class Other(){ Name na

JAVA学习第六十一课 — TCP协议

TCP传输 Socket和ServerSocket 建立客户端和服务器端(两个独立的应用程序) 建立连接后,通过Socket中的IO流进行数据的传输 关闭Socket TCP和UDP原理差不多,只是涉及的对象不一样 TCP客户端 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号. public static void TCPDemo() throws UnknownHostException, IOException { /* * T

别样JAVA学习(六)继承下(2.3)异常下

1.RuntimeException Exception中有一个特殊的子类异常RuntimeException执行时异常. 假设在函数内容抛出该异常,函数上能够不用声明.编译一样通过. 假设在函数上声明了该异常,调用者能够不用进行处理.编译一样通过. 之所以不用在函数上声明,是由于不须要让调用者处理. 当该异常发生,希望程序停止. 由于在执行时,出现了无法继续运算的情况, 希望停止程序后.对代码进行修正. 例: class Person { public void checkName(Strin

Java学习笔记六(I/O流)

1.介绍 在实际开发过程中经常会用到数据的输入/输出操作,本篇博客着重分析一下,java中经常用到的有关IO操作的类.而在java中可以将常用的流分为两个部分:字节流和字符流. 1.流的抽象基类 字节流 字符流 输入流 InputStream Reader 输出流 OutPutStream Writer 正如上图表格所示,字符和字节流都有自己的基类,其余的都是继承基类的扩展流的操作.下面会着重的讲解一下.(只要会了字符流,字节流与其操作一样,只不过操作的文件类型不一致而已) 2.字符流 专门用于

java学习笔记(六)继承

继承是面向对象编程中最重要的特征之一,它允许通过继承一个已经存在的类,来编写一个新类.已有的类称为父类,也可以称为基类,超类,新类称为子类也称为派生类. 继承使用关键字extends,用在类名之后,例:public void class salary extends Employee(){ } 子类salary 继承父类Employee java中的类只能继承一个类. 子类能继承父类中用public protected 修饰的成员. 继承的单根性(单继承):一个java类只能有一个父类. 继承的