第十章 泛型

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)

  1. 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是基本数据类型)

  1. 在给泛型指定具体类型后,可以传入该类型或者其子类类型
  2. 泛型使用形式

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..>返回类型方法名(参数列表){ }

注意细节:

  1. 泛型方法,可以定义在普通类中,也可以定义在泛型类中,
  1. 当泛型方法被调用时,类型会确定;
  2. 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坐标体系-像素

  1. 绘图还必须要搞清一个非常重要的概念-像素一个像素等于多少厘米?
  2. 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800x600,表示计算机屏幕上的每一行由800个点组成,共有600行.整个计算机屏幕共有480 000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较。

10.6.3绘图原理

Component类提供了两个和绘图相关最重要的方法:

  1. paint(Graphics g)绘制组件的外观
  2. repaint(刷新组件的外观。

当组件第一次在屏幕显示的时候,程序会自动的调用paint(方法来绘制组件.

在以下情况paint0将会被调用:

  1. 窗口最小化,再最大化
  1. 窗口的大小发生变化
  2. 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是的作用? 是Java语言中的一种参数化类机制,它允许在定义类、接口和方法时使用类参数,从而实现代码的灵活性和重用性。的作用有以下几个方面: - 提高代码的安全性和可读性:使用能够在编译期间检查类,并避免在运行时出现类转换异常。 - 代码重用和灵活性:使用能够实现代码的重用,减少代码冗余,同时也能够使代码更加灵活。 - 编写更加通用的算法和数据结构:使用能够编写更加通用的算法和数据结构,使得它们能够处理不同类的数据。 2. 什么是有界? 有界是指限定参数的类范围,通过指定参数必须是某个类或接口的子类或实现类来限定参数的类范围。Java中的有界有以下两种形式: - 上界限定:使用extends关键字指定参数必须是某个类的子类或实现类。 - 下界限定:使用super关键字指定参数必须是某个类的超类或实现类。 有界可以提高代码的安全性和可读性,同时也能够减少类转换的问题。 3. 类和方法有什么区别? 类和方法是Java中两种不同的形式。它们的区别如下: - 类:类是指在类或接口中定义参数,可以在类或接口的实例化过程中指定具体的类参数。 - 方法:方法是指在方法中定义参数,可以在方法调用时指定具体的类参数。 类和方法在使用上有一些不同: - 对于类,类参数的作用域是整个类或接口,可以在类或接口中的任何地方使用。对于方法,类参数的作用域是整个方法体,只能在方法体中使用。 - 类的类参数可以被类内部的任何成员方法使用,而方法的类参数只能被定义它的方法使用。 - 类的类参数可以被继承子类所使用,而方法的类参数只能被定义它的方法所使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值