一、内部类
1、概念:定义在方法中的类 或者是定义在类中的类
2、分类:
成员内部类:普通成员内部类 私有成员内部类 静态内部类
局部内部类:定义在方法中的内部类
匿名内部类:没有名称的内部类
3、普通成员的内部类
位置:定义在类中 方法外
语法:
访问修饰符 class 外部类名{
访问修饰符 class 内部类名{
}
}
说明:
A.内部类可以访问外部类的资源(包括私有的)
B.外部类访问内部类的资源 必须实例化对象之后 通过对象名来进行访问
C.外部类以外的类可以访问内部类的资源
语法:
外部类.内部类 对象名=new 外部类().new 内部类();
例如:OutClass.Inner in=new OutClass(). new Inner();
4、私有的成员内部类
位置:定义在类中 方法外
语法:
访问修饰符 class 外部类名{
private class 内部类名{
}
}
说明:
A.内部类可以访问外部类的资源(包括私有的)
B.外部类访问内部类的资源 必须实例化对象之后 通过对象名来进行访问
C.外部类以外的类不能访问私有的成员内部类资源(私有资源只有的本类中访问)
5、静态内部类
位置:定义在类中 方法外
语法:
访问修饰符 class 外部类名{
static class 内部类名{
}
}
说明:
A.静态内部类只能访问外部类的静态资源
B.外部类访问内部类的资源
a.如果访问是非静态资源 需要实例化对象之后 然后通过对象名来访问
b.如果访问是静态资源 直接通过类名来进行访问
C.外部类以外的类是可以访问内部类的资源的
语法:外部类.内部类 对象名=new 外部类.内部类()
例子:
6、局部内部类
位置:定义在方法中
语法:
访问修饰符 返回值类型 方法名称(){
class 类名{
}
}
说明:
局部内部类 外部类只能间接的访问局部内部类
7、匿名内部类
概念:没有名称的内部类
前提:实例化接口(实现类) 或者是抽象类(子类)
二、jar包的管理(重点)
2.1项目打包的原因
2.2打包jar步骤
step01
step02
step03
step04
step05
step06
step07
step08打包成功
2.3使用jar包
step01 在当前项目新建文件夹 lib
step02 名称lib
step03将jar放入到lib目录下
step04添加依赖
step05
step06添加依赖成功
2.4删除jar包
2.4.1删除依赖
2.3.2删除jar包
三、API
3.1简介
概念:API 应用程序接口编程 主要就是提供查看jdk相关资源的文档
3.2作用
A.jdk中提供了一些常用的方法以及类 以及接口的使用
B.使用帮助的文档来快速查找jdk提供相关的资源 提供开发效率
3.3使用
3.3.1第一种方法 通过完整的包名以及类名来查找
step01
step02
3.3.2第二种方式 直接通过类名来搜索(推荐)
step01
3.4API使用说明
A.查看类的描述
B.查看类的构造方法
C.查看成员方法以及静态方法
参数列表 返回值类型 方法描述
3.5文档注释-注解
@author 作者
@version 版本
@since 说明
@param 参数
@return 返回值
3.6生成帮助文档
四、Object(重点)
4.1简介
1、概念:
是所有类的直接父类 或者间接父类
2、构造方法:
public object()
3、作用:
A.用于来实例化队形
B.用于给子类来进行调用
4.2toString()方法
1..public String toString() 返回该对象的字符串表示getClass().getName() + '@' + Integer.toHexString(hashCode())
2.返回字符串解释getClass().getName()==> 返回值是完整包名加上类名@==>表示一个连接符号 没有特殊的含义hashCode() 表示是hashcode值Integer.toHexString()==>表示以十六进制形式来表示
3.toString() 返回的是对象的地址值 没有实际的意义 所有需要重写
4.重写的规则: 返回对象的属性值
5.快捷键 alt+insert6.自定义对象中 重写toString() 打印对象的名称 默认会调用toString()方法
step01代码-定义学生类
package com.gkd.test01; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // return "Student{" + // "name='" + name + '\'' + // ", age=" + age + // '}'; return name+"\t"+age; } }
step02代码-测试类
package com.gkd.test01; public class Test { public static void main(String[] args) { Student stu= new Student("老王",18); System.out.println(stu.toString()); System.out.println(stu); // System.out.println(stu); // System.out.println(stu.getClass().getName()+"@"+Integer.toHexString(stu.hashCode())); } }
4.3equals()方法
1.方法:public boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
2.解释:对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true两个对象的地址值是一样才返回true 两个指引 执行同一个堆的内存的地址
3.equals() 默认比较的是两个对象的地址值 没有实际的意义 所有需要进行重写
4.重写的规则:比较对象的属性值是否相同
5.快捷键:alt +insert
6.==与 比较equals()相同点: 都可以用于来比较是否相等不同点:
A.==既可以比较基本数据类型 也可以比较引用数据类型 equals() 只能比较引用数据类型
B.==比较基本数据类型 比较的数值是否相同 比较引用数据类型 比较的是地址值是否相等equals()没有重写之前 比较的对象的地址值是否相同 重写之后 比较的是对象的属性值是否相同
step01代码-Person类
package com.gkd.test02; import java.util.Objects; public class Person { private int pid; private String name; public Person() { } public Person(int pid, String name) { this.pid = pid; this.name = name; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } //自己重写的equals()方法 // @Override // public boolean equals(Object o) { // //向下转型 // Person p= (Person) o; // if(p.getPid()==this.getPid() &&p.getName().equals(this.getName())){ // return true; // } // return false; // } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return pid == person.pid && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(pid, name); } }
step02代码-测试类
package com.gkd.test02; public class Test { public static void main(String[] args) { Person p1=new Person(1001,"老王"); // Person p2=p1; // Person p2=new Person(1001,"老王"); // System.out.println(p1); // System.out.println(p2); Person p2=new Person(1001,"老王"); System.out.println(p1.equals(p2)); } }
五、String(重点)
5.1简介
1.String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现
2.字符串是常量 使用final来进行修饰 不能改变是地址值 可以改变的是对象的内容
3. String 对象是不可变的,所以可以共享
4.字符串字符值是存在堆内存中字符串常量吃 new String() 是存在 堆内存中
5.字符串的底层是使用字节数组来进行存储
step01代码-测试
package com.gkd.test03; public class Test { public static void main(String[] args) { //字符串字面值 String s1="abc"; System.out.println(s1); //实例化一个空的字符串对象 String s2=new String(); System.out.println(s2); byte [] bytes = new byte[]{97,98,99}; String s3=new String(bytes); System.out.println(s3); byte [] by = new byte[]{97,98,99}; String s4=new String(by,0,2); System.out.println(s4); char [] chars= new char[]{'a','b','c'}; String s5= new String(chars); System.out.println(s5); char [] ch= new char[]{'a','b','c'}; String s6=new String(ch,0,2); System.out.println(s6); } }
5.3字符串常用的方法-判断
方法名称 | 方法描述 |
public boolean contains(CharSequence s) | 当此字符串包含指定的 char 值序列时,返回 true |
public boolean equalsIgnoreCase(String anotherString) | 此 String 与另一个 String 比较,不考虑大小写 |
public boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
public boolean endsWith(String suffix) | 此字符串是否以指定的后缀结束 |
public boolean isEmpty() | 当且仅当 length() 为 0 时返回 true |
public int length() | 返回此字符串的长度 |
public boolean equalsIgnoreCase(StringanotherString) | 将此 String 与另一个 String 比较,不考虑大小写 |
5.4案例
step01需求:键盘录入一个邮箱地址 判断优先是否合法 以com结尾 包含@ 符号 键盘一个图片的名称判断图片是否合法
step02 分析
A.实例化Scanner
B.使用字符串方法endsWith() contains()
C.使用选择结构判断是否正确
step03代码
package com.gkd.test03; import java.util.Scanner; public class Test02 { public static void main(String[] args) { //实例化Scanner Scanner input=new Scanner(System.in); System.out.println("请输入邮箱地址:"); String email=input.next(); if(email.contains("@")&&email.endsWith("com")){ System.out.println("邮箱地址输入成功!"); }else{ System.out.println("邮箱地址输入错误"); } System.out.println("请输入图片的名称:"); String filename=input.next(); if(filename.endsWith("png")||filename.endsWith("jpg")||filename.endsWith("gif")||filename.endsWith("jpeg")){ System.out.println("图片名称输入正确!"); }else{ System.out.println("图片格式输入错误…………………………"); } } }
5.5字符串常用的方法-得到型
方法名称 | 方法描述 |
public char charAt(int index) | 返回指定索引处的 char 值 |
public int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引(从前往后进行查找) |
public int lastIndexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引(从后往前进行查找) |
public String substring(int beginIndex,int endIndex) | 截取指定的字符串(包头不包尾) |
5.6案例
step01 需求 键盘录入一串字符 通过a这个字符出现的次数
step02 分析
A.将字符串拆分一个字符数组substring()
B.使用循环遍历 与字符a进行对比
C.定义一个变量 统计其次数
step03 代码
package com.gkd.test03; import java.util.Scanner; public class Test04 { public static void main(String[] args) { Scanner input =new Scanner(System.in); System.out.println("请输入一串字符串:"); String line=input.next(); //定义一个数组 char [] arrays=new char[line.length()]; //使用循环把字符串放入数组中取 for(int i=0;i<arrays.length;i++){ arrays[i]=line.charAt(i); } //定义一个变量记录 int count=0; //遍历数组 for(int i=0;i<arrays.length;i++){ if(arrays[i]=='a'){ count++; } } System.out.println(count); } }
5.7案例
step01 需求 键盘录入一个银行卡的余额 123456789 将字符处理后的结果: 123,456,789
step02 分析
A.实例化Scanner
B.将字符串拆分到每一个字符串数组中C.使用循环从后往前遍历(倒着遍历)
i % 3 ==0 i !=0 拼接逗号
其它情况直接拼接 数据
step03 代码
package com.gkd.test03; import java.util.Scanner; public class Test05 { public static void main(String[] args) { //实例化Scanner Scanner input= new Scanner(System.in); System.out.println("请输入一串字符串:"); String line= input.next(); String [] arrays=new String[line.length()]; //使用循环放入数组中 for(int i=0;i<arrays.length;i++){ arrays[i]=line.charAt(i)+""; } //定义一个字符串来拼接 String str=""; //使用循环来遍历数组,从后往前遍历,取前面的值 for(int i=arrays.length-1;i>=0;i--){ if(i!=0&&i%3==0){ str+=arrays[arrays.length-1-i]+","; }else{ str+=arrays[arrays.length-1-i]; } } System.out.println(str); } }