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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值