1-instanceof 用法总结.
// An highlighted block
package test.work.generics;
public class Main {
public static void main(String[] args) {
/*instanceof是二元运算符
用来判断左边对象是否是右边类的子类或实例,返回布尔值*/
B b = new B();
System.out.println(b instanceof A);
A a = new A();
System.out.println(a instanceof B);
System.out.println(a instanceof A);
}
}
class A{
}
class B extends A{
}
打印结果:true
false
true
2-泛型:常见的字母及分别对应含义?
T Type表示类型
K V 分辨表示键值对中的key value
E 代表Element
?表示不确定的类型
3-泛型的优点是安全和省心,请用代码说明。
// An highlighted block
package test.work.generics;
public class Main {
public static void main(String[] args) {
/**
* 省心:定义使用泛型,使用时具体的引用类型,提高代码复用率
* 类型转换自动、隐式
*/
A<String> a1 = new A();
a1.name = "a1";
A<Integer> a2 = new A();
a2.name = 1;
A a3 = new A();
//自动类型转换
a3.name = "a3";
System.out.println(a3.name);
/**安全:使用Object可以强制转换,编译不报错,运行会报错:
java.lang.ClassCastException:
java.lang.Integer cannot be cast to java.lang.String
*/
B b = new B();
b.age = 20;
String age = (String)b.age;
System.out.println(age);
}
}
class A<T>{
T name;
}
class B{
Object age;
}
4-泛型接口注意事项是是么?
不能使用类型参数声明静态属性
5-泛型方法注意事项是什么?
1、泛型放在返回类型前面
2、泛型只能是引用类型,不能是基本类型
// An highlighted block
package test.work.generics;
/**
* 1、泛型放在返回类型前面
2、泛型只能是引用类型,不能是基本类型
*/
public class TestGenerics {
/*1、泛型放在返回类型前面*/
public static <T> void test(){
System.out.println();
}
public static <T> String test02(T t){
return (String) t;
}
/*3、泛型只能是引用类型,不能是基本类型*/
/*public W<int> test04(){//报错
}*/
public W<Integer> test05(){
return new W<Integer>();
}
}
class W<T>{
}
6-泛型:(1)子类指定具体类型,(2)子类为泛型类,(3)子类为泛型类/父类不指定类型,(4)子类与父类同时不指定类型,以上4点请分别用代码举例。
// An highlighted block
package test.work.generics;
public abstract class Father<T> {
public abstract void test(T t);
}
/**
* 子类指定具体类型
*/
class son1 extends Father<String>{
@Override
public void test(String t) {
}
}
/**
* 子类为泛型类
*/
class son2<T> extends Father<T>{
@Override
public void test(T t) {
}
}
/**
* 子类为泛型类/父类不指定类型
* 泛型擦除
*/
class son3<T> extends Father{
@Override
public void test(Object t) {
}
}
/**
*子类与父类同时不指定类型
*同时擦除
*/
class son4 extends Father{
@Override
public void test(Object t) {
}
}
7-泛型接口,方法是以父类而定还是以子类而定?
随父类而定
// An highlighted block
package test.work.generics;
public interface Father02<T> {
void test(T t);
}
/**
* 泛型接口,方法是以父类而定
* 子类擦除还是确定了类型,通过重写方法的形参可以看出
* 重写方法都是以父类而定
*
*/
class son01 implements Father02{
@Override
public void test(Object t) {
// TODO Auto-generated method stub
}
}
class son02<String> implements Father02{
@Override
public void test(Object t) {
// TODO Auto-generated method stub
}
}
/** 方法报错*/
/*class son03<String> implements Father02{
@Override
public void test(String t) {
// TODO Auto-generated method stub
}
}*/
8-形参使用多态、返回类型使用多态 请分别代码举例。
// An highlighted block
package test.work.generics;
public class Animal {
}
class Cat extends Animal{
}
class Test{
public static void main(String[] args) {
Animal cat = new Cat();
/*形参使用多态*/
test01(new Cat());
/*返回类型使用多态*/
Cat c = (Cat) test02();
}
public static void test01(Animal a){
}
public static Animal test02(){
return new Cat();
}
}
9-泛型有没有多态?
// An highlighted block
package test.work.generics;
/**
* 泛型没有多态
*
* @param <T>
*/
public class Q<T> {
public static void main(String[] args) {
Q<Animal> q = new Q<Cat>();//报错
}
public static Q<Animal> test(){
return new Q<Cat>;//报错
}
}
10-泛型的?问号: 只能声明在类型|方法上,不能声明类或者使用时,请用代码证明这句话的正确性.
// An highlighted block
package test.work.generics;
public class Q<T> {
//public class Q<?> {//声明类,编译报错
public static void main(String[] args) {
Q<?> q = new Q<Integer>();//声明类型的时候可以使用
test(new Q<String>());//使用时必须有具体的应用类型
// test(new Q<?>)//使用时 ?编译报错
}
public static void test(Q<?> a){//方法中声明
}
}
11-泛型嵌套:由外到内拆分.请用代码解释这句话.
// An highlighted block
package test.work.generics;
public class Student<T> {
T age;
public static void main(String[] args) {
Student<TestStu<String>> s = new Student<TestStu<String>>();
TestStu<String> ts = s.age;//外层赋值
String name = ts.name;//内层赋值
System.out.println(name);//打印结果:A
}
}
class TestStu<T>{
static String name ="A";
}
12-泛型有没有数组?
13-用匿名内部类实现迭代器。
// An highlighted block
package test.work.map;
import java.util.Iterator;
public class MyArrayList{
private Object[] obj;
private int size;
/**
* 匿名内部类
* @return
*/
public Iterator<Object> iterator(){
return new Iterator<Object>(){
private int curent =-1;
@Override
public boolean hasNext() {
return curent+1<size;
}
@Override
public String next() {
curent++;
return (String) obj[curent];
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
};
}
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
list.obj = new String[]{"A","B","C","D"};
list.size = list.obj.length;
Iterator it= list.iterator();
while(it.hasNext()){
System.out.println(it.next());//打印结果:A
B
C
D
}
}
}
14-用分拣思路统计字符串出现次数"this-is-my-first-dog-but-i-like-cat-and-cat-is-nice-and-dog-is-friendly-this-why-i-like-cat-more".
// An highlighted block
package test.work.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class CountStr {
public static void main(String[] args) {
String str = "this-is-my-first-dog-but-i-like-cat-and-cat-is-nice-and-dog-is-friendly-this-why-i-like-cat-more";
String[] arr = str.split("-");
Map<String,Integer> map = new HashMap<String,Integer>();
for(String s : arr){
int count =1;
if(map.containsKey(s)){
count = map.get(s);
count++;
}
map.put(s, count);
}
for(Entry<String, Integer> entry : map.entrySet()){
System.out.println(entry);
}
}
}
打印结果:
15-用面向对象思想+分拣思路统计班级总人数和平均分。
1、创建2个类,1个学生类,一个班级类,学生类关联班级类
学生类:
// An highlighted block
package test.work.map;
public class Student {
/** 姓名*/
private String name;
/** 班级*/
private ClassRoom classromm;
/** 分数*/
private double score;
public Student(String name,ClassRoom classroom,double score){
super();
this.name = name;
this.classromm = classroom;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ClassRoom getClassromm() {
return classromm;
}
public void setClassromm(ClassRoom classromm) {
this.classromm = classromm;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
班级类:
// An highlighted block
package test.work.map;
public class ClassRoom {
/** 班级编号*/
private String no;
/** 总人数*/
private Integer total;
/** 平均分*/
private double avg;
public ClassRoom(String no){
super();
this.no = no;
}
public ClassRoom(String no,Integer total,double avg){
super();
this.no = no;
this.total = total;
this.avg = avg;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public double getAvg() {
return avg;
}
public void setAvg(double avg) {
this.avg = avg;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
}
实现方法:
// An highlighted block
package test.work.map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
//添加学生
List<Student> list = new ArrayList<Student>();
addStudent(list);
//统计分数
Map<ClassRoom,List<Student>> map = statistics(list);
//打印分数
printScore(map);
}
/**
* 打印分数
* @param map
*/
public static void printScore(Map<ClassRoom,List<Student>> map){
Iterator<Entry<ClassRoom,List<Student>>> entrys = map.entrySet().iterator();
while(entrys.hasNext()){
ClassRoom classroom = entrys.next().getKey();
List<Student> stus = map.get(classroom);
double total = 0D;//班级总分
for(Student stu : stus){
total +=stu.getScore();
}
double avg = total/stus.size();
classroom.setAvg(avg);
classroom.setTotal(stus.size());
System.out.println("班级:"+classroom.getNo()+"总人数为:"+stus.size()+"平均分为:"+avg);
}
}
/**
* 统计分数
* @return Map<String,List<Student>>
*/
public static Map<ClassRoom,List<Student>> statistics(List<Student> list){
Map<ClassRoom,List<Student>> map = new HashMap<ClassRoom,List<Student>>();
for(Student stu : list){
ClassRoom cr = stu.getClassromm();
List<Student> stus = null;
if(map.containsKey(cr)){
map.get(cr).add(stu);
}else{
stus = new ArrayList<Student>();
stus.add(stu);
map.put(cr, stus);
}
}
return map;
}
/**
* 若干学生放入List
* @param list
*/
public static void addStudent(List<Student> list){
ClassRoom class1 = new ClassRoom("001");
ClassRoom class2 = new ClassRoom("002");
ClassRoom class3 = new ClassRoom("003");
list.add(new Student("a",class1,70));
list.add(new Student("b",class1,85));
list.add(new Student("a",class2,80));
list.add(new Student("c",class2,90));
list.add(new Student("d",class3,78));
list.add(new Student("e",class3,92));
}
}
打印结果: