//了解成员内部类 //创建对象,要先new出外部对象,在new出内部对象 ///外部类名.内部类名 对象=new 外部类(....)内部类(....) Out.Inner in=new Out().new Inner(); in.test();
public class Out { private int age=99; public static String a; //内部类 public class Inner{ private String name; public static String schoolName;///JDK16才支持 private int age=88; public void test(){//成员方法 System.out.println(age); System.out.println(a); int age=66; System.out.println(age);//66 System.out.println(this.age);//88 //拿到外部类的对象:通过外部类名.this来直接访问age System.out.println(Out.this.age);//99 }
//静态内部类 //外部类名.内部类名 对象名=new 外部类.内部类(。。。) Out.Inner in=new Out.Inner();
/1.把这个匿名内部类编译成子类,创建出子类对象出来 //父类 变量名=new 父类)(){、 //重写方法 //}
//认识枚举
public enum A { //注意:枚举类的第一行必须罗列枚举对象的名字 X,Y,Z; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
public enum B { // A a=new A(); //因为有抽象方法,所以不能创建对象,可以通过内部类来解决 X(){ @Override public void go(){ } }
// 1.枚举的第一行都是常量对象 A a=A.X; System.out.println(a); //2.枚举类的构造器是私有的(写不写都一样),因此,枚举对外不能创建对象 //A a=new A(); //3.枚举类都是最终类,不可以被继承 //4。枚举类中,从第二行开始,可以定义各种成员 //5. //枚举类提供一个一些额外的API A[] as=A.values();//拿到全部的对象 A a3=A.valueOf("Z");//根据枚举的常量名得到对象 System.out.println(a3.name());//Z System.out.println(a3.ordinal());//索引 B y=B.Y;
认识泛型
//认识泛型 //定义类,接口,方法,同时声明了一个或者多个类型变量(如:<E>),称为泛型类,泛型接口类,泛型方法, //提供了在编译阶段所能约束的数据类型,可以约束数据类型,就不需要强制转换了 ArrayList list=new ArrayList(); list.add("java1");
//掌握泛型类的使用 //泛型类 //修饰符 class 类名<类型变量,类型变量。。。。>{ // } public class Myclass2<E,T> { public void put(E a,T t){ } }
//泛型接口 public interface Date<E> { void add(E a); ArrayList<E> getbyname(String name); }
//泛型方法的使用 //修饰符 <类型变量,类型变量> 返回值类型 方法名 (形参列表)
//?通配符:在使用泛型的时候表示一切类型 ?extends cars(上线):是catrs的子类 ?super cars(下线):是cars的父类及以上 public static void go(ArrayList<? extends Car> cars){ }
/泛型方法 //这个T表示任何类型 public static <T> T test(T t){ return t; } }
//泛型的注意事项 // 1.泛型擦除:泛型的工作是在编译阶段,一但编译成class文件,泛型就消除了 //2.泛型不支持基本 数据类型,只支持对象类型(引用数据类型) //基本数据类型:byte,char,,short,int ,float,double,long,boolean //对象数据类型:String,Integer(整形),Float,Boolean,Character(字符型),Array(数组),Enum,Class,Interface,Void //ArrayList<int> a=new ArrayList<int>();
//掌握object类提供的对象克隆的方法 //浅克隆:复制的只是内容的地址 User u1=new User(1,"shangshan","12345",new double[]{22,33,11,223}) ; User u2= (User) u1.clone();
//浅克隆 //用super去调用父类Object中的clone方法 // return super.clone(); //深克隆 User u2=(User)super.clone(); //u2记住的是新的u2拷贝的数组对象,u2就是一个新的地址 u2.scores=u2.scores.clone(); return u2; }
//掌握object的常用方法 String s1=null; String s2="heima"; //有安全问题:s1不能是null // System.out.println(s1.equals(s2)); //不会出现null异常, System.out.println(Objects.equals(s1, s2));//更安全 //判断对象是否为null,是的话返回true,不是返回false System.out.println(Objects.isNull(s1)); System.out.println(Objects.isNull(s2)); //判断对像是否不为null.是的话返回true,不是返回false System.out.println(Objects.nonNull(s1)); System.out.println(Objects.nonNull(s1));
//包装类:将基本数据类型包装成引用型数据类型(对象) //Integer s=new Integer(12);过时的方法 Integer s1=Integer.valueOf(12);
//自动装箱:可以吧基本数据类型转换成对象 Integer s2=12; //自动拆箱:可以自动把包装类型的对象转换成对应的基本数据类 int s3=s2;
//泛型和集合都不支持使用基本数据类型,只能使用引用数据类型 //ArrayList<int> ai=new ArrayList<int>(); ArrayList<Integer> a3=new ArrayList<>(); a3.add(32);//自动装箱 a3.add(34); int f=a3.get(1);//自动拆箱
//包装类的其他操作 //1.将基本数据类型转换成字符串 Integer a5=23; String o=Integer.toString(a5);//"23"
//2.将字符串类型的数值转换成对应的基本数据类型 String h="234"; // int h1=Integer.parseInt(h); int h1=Integer.valueOf(h);
//清楚stringBuilder用法 StringBuilder a=new StringBuilder(); StringBuilder s=new StringBuilder("heima"); //1。拼接内容是 s.append(23); s.append("afl"); s.append(true); //支持链式编程 s.append(666).append(true).append("shafjk"); System.out.println(s); //2.反转内容 s.reverse(); System.out.println(s); //3.返回字符串的长度 System.out.println(s.length()); //4.把stringBuilder对象转换成string类型 String s1=s.toString(); System.out.println(s1);
//Stringjoiner的使用 //Stringjoiner(间隔符,起始符,终止符) //作用:简洁,高效 StringJoiner s=new StringJoiner(",","[","]"); s.add("aa"); s.add("223"); s.add("true"); System.out.println(s);