博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础学习笔记
阅读量:4029 次
发布时间:2019-05-24

本文共 9560 字,大约阅读时间需要 31 分钟。

java基础:

小知识点:	**double和float使用注意:		2.0的类型是double,如果使用float类型需要在后面加上f/F,例:2.0F	**如果一个类中有静态代码块,加载到内存的时候会自动执行		例如:			StaticTest类:				public class StaticTest {				    static {				        System.out.println("静态代码块执行成功");				    }				}			StaticDemo类:				main:					//把类加载到内存中,使用Class.forName方法					Class.forName("cn.com.testStatic.StaticTest");		注意:			把类加载进来的两种方式的区别:				Class.forName:加载进来后会初始化和执行静态代码块				ClassLoad.loadClass():加载进来后,不会初始化和连接,不会执行代码块				https://blog.csdn.net/m0_37284598/article/details/82950779	**加载资源:		java中获取资源的两种方式:			关于Class.getResource和ClassLoader.getResource的路径问题				ClassLoader.getResource 是以src为根路径的				Class.getResource ??				https://www.cnblogs.com/yejg1212/p/3270152.html常用类:	String:		特点:			引用类型:字符串是对象,所以是引用类型			不可变型:创建后不能改变,但是他可以被共享			底层实现:底层是字节数组(byte[])实现		构造方法:			1.空字符串				String s1 = new String()			2.根据字符数组				char[] chs = {'a','b','c'}				String s1 = new String(chs)//"abc"			3.根据字节数组				byte[] bys = {97,98,99}				String s1 = new String(bys) //"abc"			4.直接赋值				String s1 = "abc"			推荐使用第4中方法;			new String 和 字符串直接赋值的区别:				new方式:每一次new ,无论构造的字符串是否相同,都会在堆内存中申请空间				直接赋值方式:创建的字符串会放在常量池中,只要创建完“abc”字符串后,下次新变量也创建“abc”,则不会开辟新的空间,而是直接把上一次创建的字符串的地址付给该新变量即可		字符串比较:			== 比较方式:				基本类型:比较的是数据值是否相同				引用类型:比较的是地址值是否相同			字符串是引用类型,如果比较字符串内容的话怎么办?				可以使用equals(比较的对象)方法					equals方法严格区分大小写		遍历字符串:			使用 length()方法:获取字符串长度			使用 chatAt(index):获取指定索引的字符					String str = "sss";				for(int i=0;i
: 背景: 由于我们使用数组存储数据的的时候申请的空间是固定的,不能自动的伸缩和扩充,所以引入ArrayList类,它是存储空间可变的存储模型 特点: 底层使用数组实现 可以调整大小 构造方法: 无参构造方法: ArrayList
array = new ArrayList
(); 成员方法: boolean add(T t):指定元素添加到末尾 boolean add(index,T t):插入指定位置插入指定元素 boolean remove(Object):删除指定元素,返回是否成功 T remove(int index):删除指定位置元素,返回删除的元素 T set(int index,E e):修改指定位置元素,返回修改的元素 T get(int index):获取指定位置的元素 int size():返回集合中元素的个数 Math类: 方法和变量都是静态的,所以可以直接用类名调用,不用实例化 int abs(int a):返回绝对值 double ceil(double a):返回大于或者等于参数的最小double值 double floor(double a):返回小鱼或者等于参数的最大double值 int round(float a):四舍五入对参数 int max(int a,int b):返回最大值 int min(int a, intb):返回最小值 double pow(double a,double b):返回a的b次方 double random():返回值为[0.0,1.0) 注意区间左闭右开 Object类: 所有类都直接或者间接继承该类 1.toString()方法: Object类中的toString()一般用不到 建议所有子类重写该方法,可以使用自动生成该方法 2.equals()方法: 建议所有子类重写该方法,可以使用自动生成方法 Arrays类:工具类 大部分都是静态类,可以直接类名调用 String toString(int[] a) 返回指定数组的内容的字符串表示 void sort(int[] a): 给指定数组排序 工具类的设计思想: private修饰构造方法,防止被创建实例 成员用public static修饰,可以直接类名调用 基本类型包装类: 好处:可以封装一些方法对这些数据操作 Integer类: 数字转Integer: static Integer valueOf(int i) 字符串转Integer: static Integer valueOf(String s) int 转 String: 使用 String.valueOf(int i) String 转 int: 使用 Integer.parseInt(String s) 自动装箱和拆箱 Integer i = 100; //自动装箱 i +=200; // i+200自动拆箱 i = i+200 自动装箱 注意: 在开发中如果是引用类型,在使用前先判断是否为null多态: 同一对象,不同时刻表现出不同形态 前提和体现: 1.继承或者实现 2.子类重写父类方法 3.有父类引用 指向 子类对象 多态中访问成员特点: Animal a = new Cat() 成员变量:编译看左边,执行看左边 成员变量去父类中找,并使用父类的 成员方法:编译看左边,执行看右边 成员方法去父类中找,但运行子类的,如果子类没有写的话,他会继承过去,然后运行。 原因: 因为成员方法有重写,而成员变量没有 多态好处和弊端: 好处: 提高了程序的扩展性 使用父类型作为函数参数,在具体调用时,使用子类的具体方法 弊端: 使用父类型作为函数参数,在具体调用时,不能使用子类的自己特有功能 多态中的转型: 背景:可以解决多态的弊端(不能使用子类特有功能) //多态 Animal a = new Cat() 向上转型: 从子到父 父类引用指向子类对象 Animal a = new Cat() 向下转型: 从父到子 父类引用转为子类对象 Cat c = (Cat)a;抽象方法和类:abstract 引入背景: 为什么引入: 父类中的某些方法,应该不能有方法体,如果有的话,子类若没有重写该方法,若调用者调用了该方法,会调用父类的方法,这样就会逻辑出错,所以为了强制子类重写父类的某些方法的话,我们引入抽象方法和抽象类 如果一个方法没有方法体的话,这个方法应该为抽象方法,而有抽象方法的类,应该写为抽象类 作用: 可以强制子类重写父类的某些方法,这些方法用抽象修饰符修饰 不能被实例化,也就是不能直接new出来 抽象类和方法特点: 1.抽象类和抽象方法必须使用abstract关键字修饰 2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类 3.抽象类不能被直接实例化,可以通过多态的方式,通过子类来间接实例化 4.抽象类的子类 要么重写抽象类中的所有抽象方法 要么本身是一个抽象类 抽象类的成员特点: 1.成员变量 可以是变量,也可以是常量 2.构造方法: 有构造方法,但是不能直接实例化 构造方法的作用是什么?用于子类访问父类数据的初始化 3.成员方法: 可以有抽象方法,限定子类必须实现该方法,也就是子类必须完成的动作 可以有非抽象方法,提高代码的复用性(这也是继承的好用) 接口:对行为的抽象 接口的特点: 接口关键字使用interface修饰 public interface 接口名{} 类实现接口用 implements表示 public class 类名 implements 接口名{} 接口不能被实例化 怎么才能实例化? 参照多态的形式通过实现类对象实例化,叫做接口多态 多态的形式: 具体类多态(一般不会用) 抽象类多态(常用): **实现的多态,只能调用自己里面的方法 接口多态(常用): **实现的多态,只能调用自己里面的方法 多态的前提: 有继承或者实现关系 有方法重写 有父类/父接口引用指向子类/实现类对象 接口的实现类: 要么重写接口中的所有抽象方法 要么本身是个抽象类 接口中成员特点: 成员变量: 只能是静态常量 默认修饰符:public static final 构造方法: 接口中没有构造方法 **(因为接口主要是对行为的抽象,不能有具体存在) 一个类如果没有父类,默认继承自Object类 成员方法: 只能是抽象方法 默认修饰符:public abstract ****对接口和抽象类的自我理解****: 1.我们 &所有类的物体& 共同的行为的抽象放在接口中, 2.对 &其中一类物体& 共有的方法和属性抽象写成抽象类, 3.然后&某一个具体的对象&继承抽象类,实现行为接口。 我们是使用接口多态还是抽象多态还是具体实现子类? 如果使用接口多态,只能使用接口中定义的方法,不能使用继承的抽象类中的方法,如果使用抽象多态,我们只能使用抽象中的方法,不能使用接口中的方法,所以我们是用具体的实现子类,因为这个具体实现子类中方法和属性最多 类和接口的关系: 1.类和类的关系: 继承关系,只能单继承,但是可以多层继承 2.类和接口的关系: 实现关系,可以单实现,也可以实现多个接口 3.接口和接口的关系: 继承关系,可以单继承,也可以多继承 抽象类和接口的区别: 成员区别: 抽象类:变量,常量,构造方法,抽象的成员方法和非抽象的成员方法 接口:常量 ,抽象方法 关系区别: 类和类:继承,只能是单继承 类和接口:实现,可以单实现,也可以多实现 接口和接口:继承,单继承,多继承 设计理念区别: 抽象类 :对类抽象,包括属性和行为 接口 :对行为抽象,主要是行为 举例: 普通门和警报门: 只有一种普通的门: 实现方式: 因为他们都有关和开的行为,所以我们有两种方式 (推荐使用)1.可以用抽象类写close()和open()抽象方法,使所有门都继承这个抽象类 2.可以用接口类,定义close()和open()抽象方法,使所有门实现这个接口 但是,如果现在有普通门和警报门,该如何实现: 其实我们可以这样实现: 第一步:用抽象类写close()和open()抽象方法,使所有门都继承这个抽象类 第二步:定义一个接口,实现alarm()抽象方法,使具有警报功能的门实现这个接口 形参和返回值问题: 类作为形参和返回值 作为形参,需要的是该类的对象 作为返回值,需要的是该类的对象 抽象类作为形参和返回值 作为形参,需要的是抽象类的子类 作为返回值,需要的是抽象类的子类 接口作为形参和返回值 作为形参,需要的是接口的实现类 作为返回值,需要的是接口的实现类 分析问题: 对一个问题我们先从具体类分析,然后一层层的抽象成抽象类,然后在抽出接口,然后我们写代码的时候,要从接口-》抽象类-》实现子类 的顺序写 异常: 所有异常都继承Throwable类 异常体系: *Throwable类: 1.Error:硬件的问题,不需要处理 2.Exception:异常类,表示程序本身可以处理的问题 1.RuntimeException:编辑期间不检查,出现问题后,需要修改 2.非RuntimeException:编辑期间检查,并必须处理,否则不能正常运行 jvm默认处理异常方案: 1.把异常的名称,原因和位置输出控制台 2.程序在错误处停止,不会继续往下执行 程序员自己进行异常处理: *方案: 1.try{}catch()处理异常: try{ //可能出现的错误的代码 }catch(异常类名 变量名){ //异常的处理 }finally{ //无论是否出现错误都会执行 } * 在catch处理完信息后,程序可以往下执行 * Throwable中常用方法: 1.public String getMessage() 原因打印控制台 2.public String toString() 异常类型,原因打印控制台 3.public void printStackTrace():(常用) 异常类型,原因以及位置打印控制台 2.throws处理异常: 格式:放在方法的括号后面 作用:抛出异常,抛给调用这个函数的调用者来处理这个异常 抛出异常后并没有做任何处理,还需要调用者继续处理 编译时异常和运行时异常: 编译时异常:如果没有处理完,就不能编译成功 两种解决方案: 1.try..catch.. 2.throws 这种方案还需要调用者来使用try..catch..来处理 运行时异常:可以编译成功,但是运行时候会出现异常 解决方案: 1.可以不处理,出现问题后来后处理 2.也可以使用上面的两种方案 自定义异常: *背景:实际开发中,java定义的并不能满足我们得需要,比如说,学生的成绩必须是0-100之内的 格式: 1.编译时异常: public class 异常类 extends Exception{ //实现无参和有参构造 } 2.运行时异常: public class 异常类 extends RuntimeException{ //实现无参和有参构造 } *throws与throw区别: 1.位置: throws在方法声明的后面 throw在方法体内 2.是否发生异常: throws表示出现异常的可能性,并不定发生这些异常 执行throw一定是发生了异常 使用: 当我们定义完自定义异常后,我们在使用的方法后面使用throws抛出我们自定义的异常,然后在某种条件下使用throw new 自定义异常类 即可集合: 集合体系: 集合: Collection(单列)---->接口 List(可重复)---->接口 ArrayList(具体实现类) LinkList(具体实现类) Set(不可重复)---->接口 HashSet(具体实现类) TreeSet(具体实现类) Map(双列)---->接口 HashMap(具体实现类) 由key,value值组成 Collection集合 *常用方法: 1.boolean add(T e):添加元素 2.bollean remove(Object o):清空指定元素 3.void clear():清空元素 4.boolean contains(Object c):是否包含元素 5.boolean isEmpty():判断是否为空 6.int size():集合元素的个数 *集合的遍历: 使用Iterator类来遍历,它依赖于集合存在 iterator()方法: boolean hasNext():判断迭代中是否有元素 E next():返回集合中的下一个元素 案例: //获取集合对象 Collection
coll = new ArrayList<>(); //添加元素 coll.add("ss"); coll.add("dd"); //获取迭代器 Iterator
it = coll.iterator(); //进行迭代 while(it.hasNext){ String s = it.next(); //然后在操作拿到的数据即可 } List集合: *概述:有序集合(**存储和取出的元素顺序一致),可以通过索引获取元素,允许重复元素 *特有方法:(它的ArrayList中有该方法,但它父类collection类中没有) void add(int index,E element) E remove(int index) E set(int index,E element) E get(int index) *并发修改异常:ConcurrentModificationException 迭代器遍历的过程中,通过集合对象修改了集合中的元素,造成了迭代器获取元素中的判断预期修改值和实际修改值不一致 解决: 可以通过普通的for循环来解决 *ListIterator:列表迭代器 void add(E e): 在使用列表迭代器的过程中,可以使用列表迭代器的add()往集合中添加元素,不会并发修改异常 *增强for循环: 内部实现原理是使用Iterator 格式: for(元素类型 元素变量:遍历的Collection对象){ //可直接对元素变量操作 } *常用子类的特点: 1.ArrayList 底层:数组 2.LinkList: 底层:链表 *特有方法: void addFirst(E e)在列表的开头插入指定元素 void addLast(E e)在列表末尾插入指定元素 E getFirst():获取第一个元素 E getLast():获取最后一个元素 E removeFisrt():移出第一个元素,并返回 E removeLast():移除最后一个元素,并返回 set集合: 没有特殊方法,都是Collection的方法 不含有重复元素 不含有带索引的方法,所以不能使用for遍历 set的实现子类: 1.HashSet 特点: 1.底层是哈希表 2.集合的迭代顺序不能保证 3.没有带索引的方法,不能使用for遍历 4.由于是set集合,所以不包含重复元素 2.LinkHashSet: 继承了HaseSet,实现了Set接口 特点: 1.底层使用哈希表和链表实现,具有可预测的迭代次序 2.由链表保证元素有序,也就是存储和取出的顺序一致 3.由哈希表保证元素唯一,也就是没有重复的元素 3.TreeSet: 特点: 1.间接实现了Set接口 2.里面的元素是自动排序的,具体排序的规则: TreeSet():无参构造使用的自然排序进行排序 TreeSet(Comparator comparator):根据指定的比较器来排序 3.不能使用普通for遍历 4.没有重复元素泛型: 本质:参数化类型 格式:
<类名>
好处: 把运行时异常提前到了编译期间 避免了强制类型转换 泛型类: 格式:public class 类名
{} 泛型方法: 格式: public
void 方法名(T t){}:无返回值 public
T 方法名(T t){}:有返回值 泛型接口: 格式: 类型通配符: 可以表示任意类型的的父类 1.List
:表示元素类型未知的List,它的元素可以匹配任何的类型 2.通配符的上限: List
:它表示类型是Number或者它的子类 例: 继承体系: Object | Number | Integer //这是错误的 List
= new ArrayList
() 3.通配符的下限: List
:它表示类型是Number或者它的父类型 例: //这是错误的 List
= new ArrayList
() 可变参数: 格式 修饰符 返回值类型 方法名(数据类型...变量名) 例: public void sum(int...a) 可变参数的变量名其实是个数组 如果一个方法中有多个参数(包含可变参数),应该把可变参数放到最后面 可变参数中在集合中的使用: 1.Arrays有个静态方法 public static
List
asList(T...a):返回指定数组支持的固定大小的列表 注意: 1.返回的集合不能增删操作,可以修改操作 2.List接口中: public static
List
of(T...a):返回包含任意数量的元素的不可变列表 注意: 1.返回的集合不能增,删,改操作 3.Set接口: public static
Set
of(T...a):返回包含任意数量的元素的不可变集合 注意: 1.返回的集合不能增,删改操作 注意: 1.再给的元素中,不能给重复的元素 2.返回的集合不能做增,删,改操作
你可能感兴趣的文章
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>
[互联网关注]李开复教大学生回答如何学好编程
查看>>
[关注大学生]李开复给中国计算机系大学生的7点建议
查看>>
[关注大学生]大学毕业生择业:是当"鸡头"还是"凤尾"?
查看>>
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>