Java SE 学习笔记 10 抽象类与多态、接口、集合

一、抽象类与多态

1、抽象类的意义和使用

为什么要用抽象类
在面向对象的概念中,所有的对象都是通过类来表述,但并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一类具体的对象,这样的类就是抽象类。
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
抽象类的使用
抽象类需要注意以下几点:
1、abstract放在class前,指明该类是抽象类
2、abstract放在方法声明中,则该方法是抽象方法,抽象方法没有方法体
3、一个抽象类可以含有多个抽象方法,也可以含有已实现的方法
4、抽象方法必须在子类中被实现,除非子类是抽象类
计算面积、周长的实例
Shape.java:

package com.zy.demo;
	/**
	 * 形状类
	 * @author Administrator
	 *
 	 */
public abstract class Shape {
 	double dim;//半径或边长等。。。
	public Shape(double dim) {
 		 this.dim = dim;
	}
	// 抽象方法,获得面积
 	public abstract double callArea();
 	// 抽象方法,获得周长
  	public abstract double callPerimeter();
  }

定义Shape类的一个子类Circle.java:

package com.zy.demo;
public class Circle extends Shape {
	public Circle(double dim) {
  		super(dim);
 	}
 	/**
  	 * 计算面积
  	 */
 	public double callArea() {
 		return 3.14*dim*dim;
 	}
	/**
  	 * 计算周长
  	 */
	public double callPerimeter() {
  		return 2*3.14*dim;
 	}
	public static void main(String[] args) {
  		Shape circle=new Circle(10);//Object
  		//Circle circle=new Circle(10);
  		System.out.println(circle.callArea());
  		System.out.println(circle.callPerimeter());
  	}
  }

结果:
在这里插入图片描述


错误: Shape circle= new Shape(3); //抽象类不能实例化
可以通过如下方式来实例一个抽象类:

Shape someShape;
//引用Circle类的实例对象
someShape = new Circle(5);
someShape.callArea();

注意:
1、抽象类不能实例化,但可以指向一个实现它的子类对象;
2、 abstract不能与final同时修饰一个类;
3、abstract不能和static、private、final或native并列

2、final用法

1、final关键字表示的不可变的。一个类不希望被其它类继承,可以使用final,Java中的String类就是一个final类。

public final class Penguin extends Pet {       
	//…
}

2、方法不希望被重写,可以使用final,final修饰的方法表示此方法已经是“最后的、最终的”含义,即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的。

public final void print () {       
	//…
}

3、属性不希望被修改,可以使用final:

public class Penguin {       
	final String  home ="南极";// 居住地       
	public void setHome(String name){       
		this.home=home; //错误,不可再赋值    
	}
}

3、多态

多态是指,同一个事件发生在不同的对象上会产生不同的结果。
多态的实现步骤
(1) 编写父类
(2) 编写子类,子类重写父类方法
(3) 运行时,使用父类的类型、子类的对象
实现多态的两种形式:
(1)使用父类作为方法形参实现多态
(2)使用父类作为方法返回值实现多态

二、接口

1、为什么要用接口

抽象类表示的是一种继承关系,一个类只能使用一次继承关系,这样限制了类的多重体现 。使用接口解决这个问题
接口的特点:
1、Java是单继承的语言,利用接口可以模拟多继承;
2、接口是对抽象类的进一步抽象,是方法声明和常量的定义集合;
3、接口是一种行为规范,是一种“契约”;
4、接口不可以被实例化
5、实现类必须实现接口的所有方法
6、实现类可以实现多个接口
7、接口中的变量都是静态常量
为什么接口可以多继承,而类不可以?
如果有两个父类,两个父类里有一个相同的方法,那么作为子类应该怎么继承这个方法?父类1的还是父类2的?但是实现多个接口则没问题,因为不管哪个接口,调用的都是同一个实现,因为只有方法名!而且单继承的目的之一,就是降低复杂度,减少维护难度。

2、 接口的使用

接口的定义格式如下:

<访问符> interface 接口名 {	
	[访问符] <返回类型> 方法名([参数列表])......
}

注意:在定义接口的时候,接口中的所有方法和常量自动定义为public。
接口中定义的变量默认是public static final 型,且必须赋初值。
从JDK1.8开始可以使用default关键字来定义一个默认的方法来扩展接口,default关键字修饰的默认方法可以直接调用,不用子类去实现。

三、集合

Java集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map。Collection是单列集合类的根接口,其有两个重要子接口 List 和Set。
1、List接口的主要类有 ArrayList 和 LinkedList
2、Map接口的主要实现类有HashMap 和 TreeMap
各接口的特点:
List 接口存储一组不唯一,有序(插入顺序)的对象
Map接口存储一组键值对象,提供key到value的映射

1、List

在这里插入图片描述
在这里插入图片描述
List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。
LinkedList采用链表存储方式。插入、删除元素时效率比较高。
List接口常用方法:

方法名 说明
boolean add(Object o) 在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o) 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间
int size() 返回列表中的元素个数
Object get(int index) 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o) 判断列表中是否存在指定元素
boolean remove(Object o) 从列表中删除元素
Object remove(int index) 从列表中删除指定位置元素,起始索引位置从0开始

LinkedList的特殊方法:

方法名 说明
void addFirst(Object o) 在列表的首部添加元素
void addLast(Object o) 在列表的末尾添加元素
Object getFirst() 返回列表中的第一个元素
Object getLast() 返回列表中的最后一个元素
Object removeFirst() 删除并返回列表中的第一个元素
Object removeLast() 删除并返回列表中的最后一个元素

Vector和ArrayList的异同
实现原理、功能相同,可以互用。
主要区别:
Vector线程安全,ArrayList重速度轻安全,线程非安全
长度需增长时,Vector默认增长一倍,ArrayList增长50%

2、Map

在这里插入图片描述
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作,最常用的实现类是HashMap
Map接口常用方法:

方法名 说明
Object put(Object key, Object val) 以“键-值对”的方式进行存储
Object get (Object key) 根据键返回相关联的值,如果不存在指定的键,返回null
Object remove (Object key) 删除由指定的键映射的“键-值对”
int size() 返回元素个数
Set keySet () 返回键的集合
Collection values () 返回值的集合
boolean containsKey (Object key) 如果存在由指定的键映射的“键-值对”,返回true

Hashtable和HashMap的异同:
实现原理、功能相同,可以互用。
主要区别:
Hashtable继承Dictionary类,HashMap实现Map接口
Hashtable线程安全,HashMap线程非安全
Hashtable不允许null值,HashMap允许null值

注意:开发过程中,最好使用ArrayList和HashMap。

猜你喜欢

转载自blog.csdn.net/zhangzhang__yan/article/details/107771970
今日推荐