10.1 泛型的理解和好处
10.1.1使用传统方法的问题分析
1)不能加入到集合ArrayList中的数据类型进行约束(不安全)
2)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响
10.1.2泛型的好处
1)编译时,检查添加元素的类型,提高了安全性
2)减少了类型转换的次数,提高效率[说明]
√不使用泛型
Dog -加入->Object·取出-> Dog//放入到ArrayList会先转成Object,在取出时,还需要转换成Dog
√便用泛型
Dog-> Dog-> Dog/放入时,和取出时,不需要类型转换,提高效率
3)不再提示编译警告
10.2 泛型介绍
int a = 10;
理解: 泛(广泛)型(类型)=>Integer,String,Dog
1)泛型又称参数化类型,是Jdk5.0出现的新特性,解决数据类型的安全性问题
2)在类声明或实例化时只要指定好需要的具体的类型即可。
3)Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮
4)泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。
10.3 泛型的语法
10.3.1 泛型的声明
interface接口<T>和class类<K,V>0 //比如: List , ArrayList
说明:
1) 其中,T,K,V不代表值,而是表示类型。
2) 任意字母都可以。常用T表示,是Type(类型)的缩写
10.3.2泛型的实例化
要在类名后面指定类型参数的值(类型)。如:
1) List<String>strList = new ArrayList<String>0:
2) Iterator<Customer> iterator = customers.iterator0;
10.3.3泛型使用的注意事项和细节(GenericDetail)
- interface List<T>0 , public class HashSet<E>0..等等
说明 : T,E只能是引用类型
看看下面语句是否正确?:
List<Integer> list = new ArrayList<lnteger>0: // OK
List<int> list2 = new ArrayList<int>0: //错误 (int是基本数据类型)
- 在给泛型指定具体类型后,可以传入该类型或者其子类类型
- 泛型使用形式
List<Integer> list1 = new ArrayList<lnteger>0;
List<lnteger> list2 = new ArrayList<>0;[说明:
如果我们这样写 List list3 = new ArrayList(): 默认给它的泛型是[<E>E就是Object ]
即: 给泛型指向数据类型是,要求是引用类型,不能是基本数据类型
//4. 如果是这样写, 泛型默认是(Object)
ArrayList arrayList = new ArrayList(); //等价 ArrayList<Object> arrayList = new ArrayList<Object>();
10.4 自定义泛型
10.4.1自定义泛型类
基本语法:
class类名<T,R..>{1/..表示可以有多个泛型
成员
}
注意细节:
1) 普通成员可以使用泛型(属性、方法);
2) 使用泛型的数组,不能初始化;
3) 静态方法中不能使用类的泛型;
4) 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型);
5) 如果在创建对象时,没有指定类型,默认为Object。
示例:
//T=Double, R=String, M=Integer
Tiger<Double,String,Integer> g = new Tiger<>("john");
g.setT(10.9); //OK
//g.setT("yy"); //错误,类型不对
System.out.println(g);
Tiger g2 = new Tiger("john~~");//OK T=Object R=Object M=Object
g2.setT("yy"); //OK ,因为 T=Object "yy"=String 是 Object 子类
System.out.println("g2=" + g2);
//1. Tiger 后面泛型,所以我们把 Tiger 就称为自定义泛型类
//2, T, R, M 泛型的标识符, 一般是单个大写字母
//3. 泛型标识符可以有多个. //4. 普通成员可以使用泛型 (属性、方法)
//5. 使用泛型的数组,不能初始化
//6. 静态方法中不能使用类的泛型
class Tiger<T, R,M>{
}
10.4.2自定义泛型接口
基本语法:
interface接口名<T,R...>{
}
注意细节:
1)接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
2) 泛型接口的类型,在继承接口或者实现接口时确定
3) 没有指定类型,默认为Object
10.4.3自定义泛型方法
基本语法:
修饰符<T,R..>返回类型方法名(参数列表){ }
注意细节:
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中,
- 当泛型方法被调用时,类型会确定;
- public void eat(E e)0,修饰符后没有<T,R..> eat方法不是泛型方法,而是使用了泛型。
//泛型方法,可以定义在普通类中, 也可以定义在泛型类中
class Car {//普通类
public void run() {//普通方法
}
//说明 泛型方法
//1. <T,R> 就是泛型
//2. 是提供给 fly 使用的
public <T, R> void fly(T t, R r) {//泛型方法
System.out.println(t.getClass());//String
System.out.println(r.getClass());//Integer
}
}
class Fish<T, R> {//泛型类
public void run() { //普通方法
}
public <U, M> void eat(U u, M m) { //泛型方法
}
//说明
//1. 下面 hi 方法不是泛型方法
//2. 是 hi 方法使用了类声明的 泛型
public void hi(T t) {
}
//泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
public <K> void hello(R r, K k) {
System.out.println(r.getClass());//ArrayList
System.out.println(k.getClass());//Float
}
}
10.5泛型的继承和通配符
10.5.1泛型的继承和通配符说明GenericExtends.java
1) 泛型不具备继承性
List<Object> list = new ArrayList<String>0;1 //错误
2)< ?>: 支持任意泛型类型
3) <? extends A>: 支持A类以及A类的子类,规定了泛型的上限
4) <?super A>: 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
10.6java绘图坐标体系
10.6.1坐标体系-介绍
下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。
10.6.2坐标体系-像素
- 绘图还必须要搞清一个非常重要的概念-像素一个像素等于多少厘米?
- 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800x600,表示计算机屏幕上的每一行由800个点组成,共有600行.整个计算机屏幕共有480 000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较。
10.6.3绘图原理
Component类提供了两个和绘图相关最重要的方法:
- paint(Graphics g)绘制组件的外观
- repaint(刷新组件的外观。
当组件第一次在屏幕显示的时候,程序会自动的调用paint(方法来绘制组件.
在以下情况paint0将会被调用:
- 窗口最小化,再最大化
- 窗口的大小发生变化
- repaint方法被调用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 点击X退出程序
10.6.4 Graphics类
Graphics类你可以理解就是画笔,,为我们提供了各种绘制图形的方法: [参考jdk帮助文裆
//演示绘制不同的图形..
//画直线 drawLine(int x1,int y1,int x2,int y2)
g.drawLine(10, 10, 100, 100);
//画矩形边框 drawRect(int x, int y, int width, int height)
g.drawRect(10, 10, 100, 100);
//画椭圆边框 drawOval(int x, int y, int width, int height)
//填充矩形 fillRect(int x, int y, int width, int height)
//设置画笔的颜色
g.setColor(Color.blue);
g.fillRect(10, 10, 100, 100);
//填充椭圆 fillOval(int x, int y, int width, int height)
g.setColor(Color.red);
g.fillOval(10, 10, 100, 100);
//画图片 drawImage(Image img, int x, int y, ..)
//1. 获取图片资源, /bg.png 表示在该项目的根目录去获取 bg.png 图片资源
Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
g.drawImage(image, 10, 10, 175, 221, this);
//画字符串 drawString(String str, int x, int y)//写字
//给画笔设置颜色和字体
g.setColor(Color.red);
g.setFont(new Font("隶书", Font.BOLD, 50));
//这里设置的 100, 100, 是 "北京你好"左下角
g.drawString("北京你好", 100, 100);
//设置画笔的字体 setFont(Font font)
//设置画笔的颜色 setColor(Color c)