2.25 学习记录通配符 泛型接口 覆写

foreach循环:
for(数据类型 变量:数组 | 集合)「
//每一次循环会自动的将数组的内容设置给变量
}
静态导入:
Import static 包.类.*;

调用setter方法时,所有的数据类型都发生了向上转型,而在取得数据时都发生了强制性的向下转型。

泛型技术,技术的核心在于:类属性或方法的参数在定义数据类型时,可以直接使用一个标记进行占位,在具体使用时才设置其对应的数据类型,这样当设置的数据类型出现错误后,可以在程序编译时检测出来。

通配符

public class TestDemo{
	public static void main(String[] args){
	Message<Integer> m1 = new Message<Integer>();
	Message<String> m2 = new Message<String>();
	m1.setMessage(100);	//设置属性内容
	m2.setMessage("www.yootk.com");	//设置属性内容
	fun(m1);	//引用传递
	fun(m2);	//引用传递
	}
	public static void fun(Message<?> temp){//不能设置,但是可以取出
		System.out.println(temp.getMessage());
		}
	}

利用通配符?作为使用的泛型类型,这样一来,不管是Integer还是String,fun()方法都能接收,不会出现程序错误。使用通配符的意义在于可以接收对象,但是不能修改对象属性。
泛型没有继承的概念:Object类和String类在类定义关系中属于父类和子类的关系,但是换到泛型中Message与Message属于两个完全独立的概念。
“?extends 类”:设置泛型上限,可以在声明和方法参数上使用;

class Message<T extends Number>{
//设置泛型上限,只能是Number或Number子类
}

“?super类”:设置泛型下限,方法参数上使用;

public static void fun(Message<? super String> temp){
//定义泛型下限,意味着只能设置String或它的父类Object。
	System.out.println(temp.getMsg());
	}
}

泛型接口
泛型不仅可以定义在类中,也可以定义在接口上。定义在接口上的泛型被称为泛型接口。
定义泛型接口:

/**
*定义泛型接口,由于类与接口命名标准相同,为了区别出类与接口,在接口*前加上字母"I",例如:IMessage
*如果定义抽象类,则可以在前面加上Abstract,例如AbstractMessage
*
*@param <T> print()方法使用的泛型类型
*/

interface IMessage{ //定义泛型接口
public void print(T t);
}
本程序在IMessage接口上定义了泛型,同时设置的泛型将在print()使用。
任何情况下如果使用接口,就必须定义相应的子类,而对于使用了泛型的接口子类而言,有以下两种实现方式。
1.实现方式一:在子类继续设置泛型标记

package com.yootk.demo;
interface IMessage<T>{		//定义泛型接口
	public void print(T t);
	}
class MessageImpl<T> implements IMessage<T>{
//MessageImpl<T>是子类,在子类继续设置泛型,此泛型也作为接口中的泛型类型
	public void print(T t){
		System.out.print(t);
		}
	}
public class TestDemo{
	public static void main(String[] args){
	IMessage<String> msg = new MessageImpl<String>();
	msg.print("更多精彩课程请访问:www.yootk.com");
	}
}

2.实现方式二:在子类不设置泛型,而为父类明确地定义一个泛型类型

package com.yootk.demo;
interface IMessage<T>{	
//定义泛型接口
	public void print(T t);
	}
class MessageImpl implements IMessage<String>{
//子类为父接口设置具体泛型类型,在这里设置为String类型
	public void print(String t){
		System.out.println(t);
		}
	}
public class TestDemo{
	public static void main(String[] args){
		IMessage<String> msg = new MessageImpl();
		msg.print("更多课程请访问:www.yootk.com");
		}
	}

枚举:
利用枚举限定对象的产生格式,并且其要比多例设计模式更加简单。
使用Enum定义的方法。

package com.yootk.demo;
enum Color{	//定义枚举类
	RED,GREEN,BLUE;//表示此处为实例化对象
}
public class TestDemo{
	public static void main(String[] args){
	Color red = Color.RED; //直接取得枚举对象
	System.out.println("枚举对象序号:" + red.ordinal());
	System.out.println("枚举对象名称:" + red,name());
	}
}
程序执行结果:枚举对象序号:0
			枚举对象名称:RED

enum和Enum的关系。
enum是JDK1.5之后定义的新关键字,主要用于定义枚举类型,在JAVA中每一个使用enum定义的枚举类型实际上都表示一个类默认继承了Enum类。

(1)枚举中定义的构造方法不能使用public声明,如果没有无参构造,要手工调用构造传递参数;
(2)枚举对象必须要放在首行,随后才可以定义属性、构造、普通方法等结构。

Annotation是JDK1.5最大的特色,利用注解的形式来实现程序的不同功能实现。

准确的覆写:@Override
当进行方法覆写时,为了保证子类所覆写的方法的确实父类中定义过的方法,就可以加上“@Override”注解,这样即使用户覆写方法时出现了错误,也可以在编译时直接检查出来。

class Book{
	@Override		//只要正确进行了覆写,就不会出现编译的语法错误
	public String toString(){//原本打算覆写toString()
		rerurn "准确覆写";
		}
	}

声明过期操作:@Deprecated
用“@Deprecated"注解来声明过期的不建议使用的方法。

压制警告:@SuppressWarnnings
取消警告信息消失,不再重复提示。

接口定义增强
在JAVA中,接口是解决多继承的主要手段,并且接口是由抽象方法和全局常量组成的。而这样的设计是从JDK1.8后开始发生改变的,即从JDK1.8开始可以在接口中定义普通方法(使用default声明)和静态方法(使用static声明)。
本来接口是不支持普通方法和静态方法的,但是开发过程中已经产生了非常多的接口,如果突然发现,接口的功能设计不足,需要扩写一些新的操作方法,就会很麻烦,所以后来允许在接口中定义普通方法和静态方法。

发布了48 篇原创文章 · 获赞 9 · 访问量 7903

猜你喜欢

转载自blog.csdn.net/trh_csdn/article/details/104487379
今日推荐