IDEA常用快捷
main方法 ——> psvm
多行注释 ——-> Ctrl+Shift+/
格式化代码 ——> Ctrl +Alt+L
生成左边变量 ——> ctrl+Alt+V
查看类结构 —-> Alt+7
数组
public class Test01 {
public static void main(String[] args) {
int[] arr1 = new int[2];
arr1[0] = 100;
arr1[1] = 200;
int[] arr2 = arr1;
arr2[0] = 1;
arr2[1] = 2;
System.out.println(arr1); //打印地址
System.out.println(arr1[0]);
System.out.println(arr2);
System.out.println(arr2[0]);
int[] arr3 = {1,2};
System.out.println(arr3[0]);
System.out.println(arr3[1]);
}
}
方法的重载
- 同一类中
- 方法名相同
- 参数不同(类型或者数量)
- 与返回类型无关
- 根据输入的参数,区分调用的方法
public class Test02 {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum(10.0,20.0));
int i = sum(1,2,3);
System.out.println(i);
}
public static int sum(int a,int b){
return a+b;
}
public static int sum(int a,int b,int c){
return a+b+c;
}
public static double sum(double a,double b){
return a+b;
}
}
方法参数传递
对于基本数据类型的参数,形式参数的改变,不会影响实参的值
public class Test03 {
public static void main(String[] args) {
int number = 100;
change(number);
System.out.println(number); //100
}
private static void change(int number) {
number = 200;
}
}
对于引用数据类型的参数,形式参数的改变,将会影响实参的值
public class Test03 {
public static void main(String[] args) {
int[] arr={1,2,3};
change(arr);
System.out.println(arr[0]); //10
}
private static void change(int[] arr) {
arr[0] = 10;
}
}
输出
System.out.print() 不换行
int[] arr3 = {1,2,3,4,5};
for (int i=0;i<arr3.length;i++){
System.out.print(arr3[i]+",");
}
输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入a:");
int a = sc.nextInt();
System.out.println("输入的a为:"+a);
逢7过
for (int i = 1;i<100;i++){
if (i%7==0||i%10==7||i/10==7){
System.out.println("过");
}else{
System.out.print(i+"\0");
}
}
1 2 3 4 5 6 过
8 9 10 11 12 13 过
15 16 过
18 19 20 过
22 23 24 25 26 过
过
29 30 31 32 33 34 过
36 过
38 39 40 41 过
43 44 45 46 过
48 过
50 51 52 53 54 55 过
过
58 59 60 61 62 过
64 65 66 过
68 69 过
过
过
过
过
过
过
过
过
过
80 81 82 83 过
85 86 过
88 89 90 过
92 93 94 95 96 过
过
99
类调用
成员变量 ——-> 方法之外
class Test02
public class Test02 {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum(10.0,20.0));
int i = sum(1,2,3);
System.out.println(i);
}
int age = 18;
public static int sum(int a,int b){
return a+b;
}
public static int sum(int a,int b,int c){
return a+b+c;
}
public static double sum(double a,double b){
return a+b;
}
}
class Test3
public static void main(String[] args) {
Test02 t2 = new Test02();
System.out.println(t2.sum(2, 3));
System.out.println(t2.age);
}
指向相同
public static void main(String[] args) {
Test02 t2 = new Test02();
System.out.println(t2.age); //18
Test02 t1 = t2;
t1.age = 20;
System.out.println(t1.age); //20
System.out.println(t2.age); //20
}
变量
封装private
以private封装成员变量,提供get/set方法供它类访问变量和修改变量,它类不可直接访问成员变量
class Test02
private int age;
以下访问将报错
Test02 t2 = new Test02();
System.out.println(t2.age);
正确访问,调用对应的get方法
Test02 t2 = new Test02();
System.out.println(t2.getAge()); //0
构造方法
//无参
public Test02() {
}
//带参
public Test02(int age, String name) {
this.age = age;
this.name = name;
}
public class Test03 {
public static void main(String[] args) {
//无参创建对象,默认0
Test02 t2 = new Test02();
System.out.println(t2.getAge()); //0
Test02 t3 = new Test02(30,"名字");
System.out.println(t3.getAge()+","+t3.getName()); //30,名字
}
}
字符串
public static void main(String[] args) {
char[] chr = {'a', 'b', 'c'};
String s1 = new String(chr);
String s2 = new String(chr);
System.out.println(s1 == s2); //比较地址 false
String a = "abc";
String b = "abc";
System.out.println(a == b); //true
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4); //false
}
添加和反转
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("world");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
}
Hello world
dlrow olleH
反转
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符:");
String line = sc.nextLine();
String s = ToReverse(line);
System.out.println(s);
}
private static String ToReverse(String line) {
return new StringBuilder().append(line).reverse().toString();
}
ArrayList相关方法
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("hello");
arrayList.add("world");
System.out.println(arrayList); //[hello, world]
arrayList.add(0,"java"); //指定索引处添加
System.out.println(arrayList); //[java, hello, world]
}
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("hello");
arrayList.add("world");
System.out.println(arrayList);
arrayList.add(0,"java"); //指定索引处添加
System.out.println(arrayList);
int size = arrayList.size();
System.out.println(size);
/*
boolean hello = arrayList.remove("Hello");
System.out.println(hello); //false
boolean hello1 = arrayList.remove("hello");
System.out.println(hello1); //true
String remove = arrayList.remove(0);
System.out.println(remove);
*/
String set = arrayList.set(0, "修改了0索引的元素");
System.out.println("返回被修改的元素"+set);
System.out.println(arrayList);
System.out.println(arrayList.get(0));
}
Arraylist的遍历
结果相同
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("hello");
arrayList.add("world");
System.out.println(arrayList);
arrayList.add(0,"java"); //指定索引处添加
//方式一
for (String arrayList1:arrayList){
System.out.println(arrayList1);
}
//方式二
for (int i = 0;i<arrayList.size();i++){
System.out.println(arrayList.get(i));
}
}
public static void main(String[] args) {
ArrayList<Test02> arrayList = new ArrayList<>();
Test02 t1 = new Test02(30,"张三");
Test02 t2 = new Test02(26,"李四");
Test02 t3 = new Test02(14,"王五");
arrayList.add(t1);
arrayList.add(t2);
arrayList.add(t3);
//方式一
for (Test02 arrayList1:arrayList){
System.out.println(arrayList1.getAge()+","+arrayList1.getName());
}
//方式二
for (int i = 0;i<arrayList.size();i++){
System.out.println(arrayList.get(i).getAge());
}
}
继承
Test02
public class Test02 {
private int num = 20;
int number = 10;
public void t2(){
System.out.println("test2");
}
}
Test03
public class Test03 extends Test02 {
public void t3(){
System.out.println("Test03");
}
public static void main(String[] args) {
Test03 t3 = new Test03();
t3.t3();
t3.t2(); //父类中的方法
System.out.println(t3.number); //父类中的变量
//但是不可直接访问 num变量,因为num被private保护
}
}
Test03
test2
10
- 使子类可以调用父类中的方法和变量
- 如子类与父类含有相同的方法,优先调用子类的方法
this关键字与super关键字
public class Test01 {
int age = 8;
public static void main(String[] args) {
Test01 test01 = new Test01();
test01.show();
}
public void show(){
int age = 10;
System.out.println(age); //10
System.out.println(this.age); //8
}
}
public class Test03 extends Test01 {
int age = 12;
public void t3(){
int age = 1;
System.out.println("Test03");
System.out.println(age); //1
System.out.println(this.age); //12
System.out.println(super.age); //8
}
public static void main(String[] args) {
Test03 test03 = new Test03();
test03.t3();
}
}
继承中构造方法访问特点
public class Fu {
public Fu(){
System.out.println("Fu无参构造方法");
}
public Fu(int age){
System.out.println("Fu带参构造方法");
}
}
public class Zi extends Fu {
public Zi(){
super(); //默认的访问无参构造方法,可省
System.out.println("Zi无参构造方法");
}
public Zi(int age){
super(); //默认的访问无参构造方法,可省
System.out.println("Zi带参构造方法");
}
}
public static void main(String[] args) {
Zi zi = new Zi();
Zi zi1 = new Zi(18);
}
Fu无参构造方法
Zi无参构造方法
Fu无参构造方法
Zi带参构造方法
都将先调用父类的无参构造方法,
原因:子类的构造方法默认将先访问父类的构造方法,因为子类继承父类,可能会使用到父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化.
调用父类中带参构造方法
如果父类中没有 —> 无参构造方法,想让其子类访问带参构造方法
使用 super(1); //访问带参构造方法
public Zi(){
super(1); //访问带参构造方法
System.out.println("Zi无参构造方法");
}
public Zi(int age){
super(1);
System.out.println("Zi带参构造方法");
}
Fu带参构造方法
Zi无参构造方法
Fu带参构造方法
Zi带参构造方法
或
在父类中添加无参构造方法(常用)
子类父类方法同名
super.show(); //调用父类中的show方法
public class Fu {
public void show(){
System.out.println("FuZ中show");
}
}
public class Zi extends Fu {
public void show(){
System.out.println("Zi中show");
}
public void show_FU(){
super.show();
}
}
public class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
zi.show_FU();
}
}
Zi中show
FuZ中show
方法的重写
如果父类中的方法修饰符为 private 或final 修饰的方法,则此方法不可被重写
且子类 方法修饰符范围需大于 父类中的方法修饰符
范围大小 public > 默认的(即不写修饰符) > private
public class Fu {
public void show(){
System.out.println("FuZ中show");
}
}
public class Zi extends Fu {
@Override //标注方法为父类中重写的方法
public void show(){
System.out.println("show方法重写");
super.show();
}
}
public class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
关键词final
修饰在类或方法或变量上,修饰后将不可被更改
public final class Zi {
final int age=10; //修饰在成员变量上,必须给出初始值
public final void show(){
System.out.println("final关键字");
}
}
引用类型:
表示地址不能被修改,所以值能能修改成功
public static void main(String[] args) {
final Fu fu = new Fu();
fu.arrayList.add("hello");
System.out.println(fu.arrayList.get(0));
fu = new Fu(); //将报错
}
去除final正常运行
public static void main(String[] args) {
Fu fu = new Fu();
fu.arrayList.add("hello");
System.out.println(fu.arrayList.get(0));
fu = new Fu();
int size = fu.arrayList.size();
System.out.println(size);
}
static关键字
被static修饰的,可直接通过类名访问
被类的所有对象共享
public class Zi {
public String name;
public static int age;
public void show(){
System.out.println(name+","+age);
}
}
public class Demo {
public static void main(String[] args) {
Zi.age = 100; //通过类名访问
Zi zi = new Zi();
zi.name = "张三";
zi.show();
Zi zi1 = new Zi();
zi.name = "李四";
zi.show();
}
}
类所有的对象共享,即所有对象的age都为100了
张三,100
李四,100
被static修饰的方法 只能访问静态方法和变量
public class Zi {
public String name;
public static int age;
public void show(){
System.out.println(name);
System.out.println(age); //调用静态变量
show1(); //调用静态方法
show(); //调用自己
}
public static void show1(){
System.out.println(name); //报错
System.out.println(age); //调用静态变量
show1(); //调用静态方法
show(); //报错
}
}
多态
同一对象在不同时刻表现出的不同状态
前提
- 继承/接口
- 方法重写
- 有父类引用指向子类对象
Fu fu = new Zi(); //父类引用指向子类对象
编译看左边,运行看右边
多态的形式:
- 具体类多态
- 抽象类多态
- 接口多态
public class Animal {
static int age = 4;
public void eat(){
System.out.println("动物");
}
}
public class Cat extends Animal {
static int age = 3;
public String name = "小猫";
@Override
public void eat() {
System.out.println("猫");
}
public void playgame(){
System.out.println("玩毛线");
}
}
public class Demo {
public static void main(String[] args) {
//父类引用指向子类
Animal animal = new Cat();
System.out.println(animal.age); //输出父类定义的成员变量值--> 4 行为多态,变量不多态
//无法调用子类中特有的变量 name
animal.eat(); //输出重写后方法的内容,即子类的方法--> 猫
/*
虽然输出的是子类方法中的内容,但是不可调用父类中不存在的方法
为什么输出的是子类方法中的内容?
因为父类的方法被重写了
*/
}
}
分割线
public class Fu {
public void eat(){
System.out.println("FU类方法");
}
}
public class Zi extends Fu {
@Override
public void eat() {
System.out.println("ZI类重写方法");
}
}
public class Demo {
public static void main(String[] args) {
Fu fu = new Zi(); //父类引用指向子类对象
fu.eat();
Fu fu1 = new Fu();
fu1.eat();
}
}
ZI类重写方法
FU类方法
多态的好处
使用父类作形参,使用子类作实参,提高程序扩展性
缺点:不能访问子类所特有的方法
public class Animal {
public void eat(){
System.out.println("动物");
}
}
public class AnimalOperator {
/*
public void userAnimal(Cat c){
c.eat();
}
public void userAnimal(Dog d){
d.eat();
}
*/
public void userAnimal(Animal a){
//Animal a = new Cat();
//Animal a = new Dog();
a.eat();
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫的eat方法");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃粑粑");
}
}
public class Demo {
public static void main(String[] args) {
AnimalOperator animalOperator = new AnimalOperator();
Cat cat = new Cat();
animalOperator.userAnimal(cat);
Dog dog = new Dog();
animalOperator.userAnimal(dog);
}
}
ZI类重写方法
Nu类重写方法
多态中的转型
在ZI类添加方法
public void special(){
System.out.println("俺是ZI类特有的方法");
}
main方法中添加测试
Fu f = new Zi(); //向上转型 子转父
Zi z1 = (Zi)f; //向下转型 父转子
z1.special(); //俺是ZI类特有的方法
分割线
public class Animal {
public void eat(){
System.out.println("动物");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫的eat方法");
}
public void play(){
System.out.println("猫玩毛线团");
}
}
/*
多态的转型
*/
public class Demo {
public static void main(String[] args) {
Animal animal = new Cat(); //向上转型
animal.eat();
//访问子类特有的方法
//方式一
Cat cat1 = new Cat();
cat1.play();
//方式二
//不用创建新的对象
Cat cat2 = (Cat)animal; //向下转型
cat2.play();
animal = new Dog();
animal.eat();
}
}
输出:
猫的eat方法
猫玩毛线团猫玩毛线团
狗吃粑粑
小案例
public class Animal {
private String name;
private int age;
public Animal() {
}
//需父类创建带参构造方法,子类才可创建带参构造方法
public Animal(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;
}
public void eat(){
System.out.println("动物吃肉");
}
}
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃粑粑");
}
}
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫猫吃鱼");
}
}
public class Demo {
public static void main(String[] args) {
Animal a = new Cat(); //无参构造
a.setName("加非");
a.setAge(9);
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Cat("梦琪",12); //带参构造
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Dog("旺财",18);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
加非,9
猫猫吃鱼
梦琪,12
猫猫吃鱼
旺财,18
狗吃粑粑
abstract关键字
一个方法没有方法体,应该被定义为抽象方法;而含有抽象方法的类,应被定义为抽象类
抽象类可以没有抽象方法,但无意义
- 限定子类必须去 重写 父抽象类中的 抽象方法
- 有构造方法 ,但是不能直接实例化,用于子类数据的初始化
- 抽象方法只能在抽象类中创建,但是抽象类中可以没有抽象方法
- 子类要不重写父类的抽象方法,要不子类也为抽象类
/*
抽象类
*/
public abstract class Animal {
public abstract void eat();
public void sleep(){
System.out.println("动物想睡觉");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫猫吃鱼鱼");
}
/*
public void sleep(){
System.out.println("猫也要睡觉");
}
*/
}
public class Demo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.sleep();
}
}
猫猫吃鱼鱼
动物想睡觉
/*
抽象类
*/
public abstract class Animal {
private int age = 20;
private final String city = "武汉";
//构造方法,用于子类访问父类初始化数据
public Animal() {
}
public Animal(int age) {
this.age = age;
}
public void show() {
age = 40;
System.out.println(age + "," + city);
}
public abstract void eat();
}
小案例
/*
抽象类
*/
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(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;
}
public abstract void eat();
}
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗狗吃粑粑");
}
}
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫猫吃鱼鱼");
}
}
public class Demo {
public static void main(String[] args) {
Animal a = new Cat("加菲猫",12);
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Dog("旺财",10);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
加菲猫,12
猫猫吃鱼鱼
旺财,10
狗狗吃粑粑
接口interface
接口默认常量,即默认使用final修饰过,不可再次赋值
主要对行为进行抽象,无构造方法
所有类直接或间接指向父类 Object类,
JDK8和JDK9对接口有新特性
一个类可以实现多个接口
且一个接口可以继承多个接口
- 默认修饰符 public static final
- 没有构造方法
- 默认方法修饰符 public abstract ,无方法体
以下两种相同
public static final int age = 30;
int age = 30;
public abstract void eat();
void eat();
抽象类是对事物的抽象,接口是对行为的抽象
接口实现类implements
要么重写接口中的所有抽象方法,要么是抽象类
访问特点
/*
接口类
*/
public interface Jumpping{
int num = 10;
int num2 = 20;
void eat();
}
/*
接口实现类
*/
public class Cat implements Jumpping {
@Override
public void eat() {
System.out.println("猫吃奶");
}
}
public class Demo {
public static void main(String[] args) {
Jumpping j = new Cat();
System.out.println(j.num);
j.eat();
System.out.println(Jumpping.num2); //可直接使用接口名访问,因为默认使用static修饰
}
}
小案例
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(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;
}
public abstract void eat();
}
public interface Jumpping{
void jump();
}
public class Dog extends Animal implements Jumpping {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃粑粑");
}
@Override
public void jump() {
System.out.println("狗能跳的更高了");
}
}
/*
接口实现 类继承
*/
public class Cat extends Animal implements Jumpping {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃奶");
}
@Override
public void jump() {
System.out.println("猫学会了跳高");
}
}
/*
测试类
*/
public class Demo {
public static void main(String[] args) {
//接口中无法调用get/set方法,所以常用的还是具体类实现
Jumpping j = new Cat();
j.jump();
j = new Dog();
j.jump();
//常用de,可以调用更多的方法
Cat cat = new Cat();
cat.eat();
cat.jump();
System.out.println(cat.getName()+","+cat.getAge());
Animal a = new Cat("加菲猫",12);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
猫学会了跳高
狗能跳的更高了
猫吃奶
猫学会了跳高
null,0
加菲猫,12
猫吃奶
内部类
访问特点
- 内部类可直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
/*
外部类
*/
public class Outer {
private int num = 10;
/*
成员内部类,注意:使用public修饰不常用,常使用private
*/
public class Inner{
public void show(){
System.out.println(num); //内部可直接访问外部私有变量
}
}
public void method(){
/*
局部内部类,定义在类方法中
*/
class Inner{
public void show(){
System.out.println(num);
}
}
Inner i = new Inner();
i.show(); //外部访问需创建对象
}
}
public class Demo {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner(); //创建内部类对象
oi.show();
}
}
当修饰符变为private时不可直接访问
但外部类对象可访问内部类对象,所以我们可通过外部类对象间接访问内部类
private class Inner{
public void show(){
System.out.println(num); //内部可直接访问外部私有变量
}
}
public void method(){
Inner i = new Inner();
i.show(); //外部访问需创建对象
}
Outer o = new Outer();
o.method(); //输出num的值
局部内部类
/*
外部类
*/
public class Outer {
private int num = 10;
/*
成员内部类
*/
private class Inner{
public void show(){
System.out.println(num); //内部可直接访问外部私有变量
}
}
public void method(){
/*
局部内部类
*/
int num2 = 20;
class Inner1{
public void show(){
System.out.println(num2);
System.out.println("局部内部类方法");
}
}
Inner i = new Inner();
i.show(); //外部访问需创建对象
Inner1 i1 = new Inner1();
i1.show(); //局部内部类访问
}
}
public class Demo {
public static void main(String[] args) {
/*
Outer.Inner oi = new Outer().new Inner();
oi.show();
*/
Outer o = new Outer();
o.method();
}
}
10
20
局部内部类方法
匿名内部类
public interface Inter {
void show();
}
/*
外部类
*/
public class Outer {
public void method(){
/*
匿名内部类
本质:一个没有名字的对象
*/
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
/*
既然是对象,可直接在后面调用方法
*/
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
/*
可看做Inter接口的实现类对象
*/
Inter i = new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show();
}
}
public class Demo {
public static void main(String[] args) {
/*
Outer.Inner oi = new Outer().new Inner();
oi.show();
*/
Outer o = new Outer();
o.method();
}
}
匿名内部类
匿名内部类
使用
public interface Jumpping {
void jump();
}
public class JumppingOperator {
public void method(Jumpping j){
j.jump();
}
}
public class Demo {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
/*
匿名函数作接口的实现类对象,以匿名函数作参数传入method方法
*/
jo.method(new Jumpping() {
@Override
public void jump() {
System.out.println("匿名函数1号");
}
});
jo.method(new Jumpping() {
@Override
public void jump() {
System.out.println("匿名函数2号");
}
});
}
}
Math类函数
public static void main(String[] args) {
//取绝对值
System.out.println(Math.abs(-88.2));
//向上取整,返回类型为float
System.out.println(Math.ceil(12.49));
System.out.println(Math.ceil(12.56));
//向下取整,返回类型为float
System.out.println(Math.floor(12.49));
System.out.println(Math.floor(12.56));
//四舍五入取整,返回int类型
System.out.println(Math.round(12.49F));
System.out.println(Math.round(12.56F));
//返回两数最大最小
System.out.println(Math.max(12,43));
System.out.println(Math.min(12,43));
//返回a的b次方,即2的3次方,类型为float型 8.0
System.out.println(Math.pow(2,3));
//返回[0,1)之间的随机数
System.out.println(Math.random());
}
System类
public static void main(String[] args) {
System.out.println("开始");
System.exit(0); //结束java虚拟机运行,将不会往后执行
System.out.println("结束");
/*
返回1970年1月1日至今(系统时间)的毫秒数
*/
double l = System.currentTimeMillis()*1.0/1000/60/60/24/365;
System.out.println("1970年1月1日至今已有"+l+"年");
/*
测试循环一万次打印所花费时间
*/
long start = System.currentTimeMillis();
for (int i=0;i<10000;i++){
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("循环一万次打印所花费"+(end-start)+"毫秒");
}
Object类
public class Student {
private String name;
private int age;
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;
}
}
public class Demo {
public static void main(String[] args) {
Student s = new Student("张三",18);
System.out.println(s);
//fit.itheima_03.Student@1b6d3586
Student s1 = new Student("张三",18);
//都比较的是地址值
System.out.println(s==s1); //false
System.out.println(s.equals(s1)); //false
}
}
重写toString方法后
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
Student s = new Student("张三",18);
System.out.println(s);
//Student{name='张三', age=18}
重写equals方法,Alt+insert, IDEA default
@Override
public boolean equals(Object o) {
/*
this---->s
o---->s1
*/
//比较地址
if (this == o) return true;
//判断是否同类
if (o == null || getClass() != o.getClass()) return false;
//向下转型
Student student = (Student) o;
//比较age
if (age != student.age) return false;
//再比较name
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
public static void main(String[] args) {
Student s = new Student("张三",18);
Student s1 = new Student("张三",18);
//重写后的equals将比较的是内容
System.out.println(s==s1); //false
System.out.println(s.equals(s1)); //true
}
Arrays类
public static void main(String[] args) {
int[] arr = {43,21,43,6,3,67,87,54};
System.out.println(arr);
// [I@1b6d3586
System.out.println(Arrays.toString(arr));
// [43, 21, 43, 6, 3, 67, 87, 54]
Arrays.sort(arr); //排序
System.out.println(Arrays.toString(arr));
// [3, 6, 21, 43, 43, 54, 67, 87]
}
工具类设计思想
构造方法用private修饰 , 防止外界创建对象
成员方法使用 public static修饰,可直接使用类名访问方法
包装类
Int与String相互转换
public static void main(String[] args) {
int num = 100;
System.out.println(getType(num)+"---"+num);
//class java.lang.Integer---100
String s1 = ""+num;
System.out.println(getType(s1)+"---"+s1);
//class java.lang.String---100
String s2 = String.valueOf(num);
System.out.println(getType(s2)+"---"+s2);
//class java.lang.String---100
String s = "100";
Integer i = Integer.valueOf(s);
System.out.println(getType(i)+"---"+i);
//class java.lang.Integer---100
int x = i.intValue();
System.out.println(getType(x)+"---"+x);
//class java.lang.Integer---100
int y = Integer.parseInt(s);
System.out.println(getType(y)+"---"+y);
//class java.lang.Integer---100
}
private static String getType(Object a) {
return a.getClass().toString();
}
常用方法
Int ——> String
String s2 = String.valueOf(num);
String——> Int
int y = Integer.parseInt(s);
集合与数组转换
public static void main(String[] args) {
String str = "23 98 54 76 12 87";
//分割转为String[]数组
String[] strarr = str.split(" ");
Arrays.sort(strarr);
System.out.println(Arrays.toString(strarr));
/*
//转换为集合
ArrayList<Integer> ints = new ArrayList<>();
for (String s : strarr) {
int y = Integer.parseInt(s);
ints.add(y);
}
System.out.println(ints);
//转换为Integer[]数组,排序
Integer[] arr = new Integer[strarr.length];
ints.toArray(arr);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
*/
//转为字符串
StringBuilder sb = new StringBuilder();
for (String a:strarr){
sb.append(a).append(" ");
}
System.out.println(sb);
}
【强制】使用集合转数组的方法,必须使用集合的
toArray(T[] array)
,传入的是类型完全一样的数组,大小就是list.size()
。
说明: 使用toArray
带参方法,入参分配的数组空间不够大时,toArray
方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]
的数组元素将被置为null
,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
反例: 直接使用toArray
无参方法存在问题,此方法返回值只能是Object[]
类,若强转其它类型数组将出现ClassCastException
错误。List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
【强制】使用工具类
Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方
法,它的add/remove/clear
方法会抛出UnsupportedOperationException
异常。
说明:asList
的返回对象是一个Arrays
内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。
第一种情况:list.add("c");
运行时异常。
第二种情况:str[0] = "gujin";
那么 list.get(0)也会随之修改。String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
装箱与拆箱
//装箱
Integer i = Integer.valueOf(100);
//自动装箱
Integer i1 = 100;
//拆箱
int in = i1.intValue();
//自动拆箱
int in1 = i1;
Date
Date date = new Date();
System.out.println(date);
//Sun Nov 07 18:26:44 CST 2021
System.out.println(date.getTime());
//返回1970年1月1日到目前的毫秒数
//1636280997605
long time = System.currentTimeMillis();
//返回1970年1月1日到目前的毫秒数
System.out.println(time);
//1636281155593
SimpleDateFormat
public static void main(String[] args) throws ParseException {
//Date转String
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
String s = sdf.format(date);
System.out.println(s);
//21-11-7 下午7:33
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 ");
String s1 = sdf1.format(date);
System.out.println(s1);
//2021年11月07日 19时33分03秒
//String到date
String ss = "2021-11-06 23:13:33";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(ss);
System.out.println(dd);
//Sat Nov 06 23:13:33 CST 2021
}
封装为工具类
public class DateUtils {
//私有工具类
private DateUtils(){}
public static String dateToString(Date date,String format){
SimpleDateFormat sdf = new SimpleDateFormat(format);
String dateString = sdf.format(date);
return dateString;
}
public static Date stringToDate(String dateString,String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date1 = sdf.parse(dateString);
return date1;
}
}
测试
public static void main(String[] args) throws ParseException {
Date date = new Date();
String s = DateUtils.dateToString(date, "yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(s);
//2021年11月07日 19时54分30秒
String s1 = "2021-11-07 12:12:12";
Date date1 = DateUtils.stringToDate(s1,"yyyy-MM-dd HH:mm:ss");
System.out.println(date1);
//Sun Nov 07 12:12:12 CST 2021
}
Calendar
// 获取 日历类对象
Calendar c = Calendar.getInstance();
//System.out.println(c);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日");
//2021年11月7日
c.add(Calendar.YEAR,-1); //一年前
int year1 = c.get(Calendar.YEAR);
int month1 = c.get(Calendar.MONTH)+1;
int date1 = c.get(Calendar.DATE);
System.out.println(year1+"年"+month1+"月"+date1+"日");
//2020年11月7日
// 获取 日历类对象
Calendar c = Calendar.getInstance();
//System.out.println(c);
//设定 日历,注意月份从0开始
c.set(2021,11,8);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日");
//2021年12月8日
异常
异常处理
JVM默认处理方式
1.打印出错信息(原因及出错位置)
2.停止执行
public static void main(String[] args) throws ParseException {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
try {
int[] arr = {1,2,3};
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace(); //输出错误信息到控制台
System.out.println("数组索引不存在");
}
}
开始 数组索引不存在 结束 java.lang.ArrayIndexOutOfBoundsException: 3 at fit.itheima_05.Demo.method(Demo.java:17) at fit.itheima_05.Demo.main(Demo.java:10)
Process finished with exit code 0
e.printStackTrace(); //输出错误信息到控制台
System.out.println("数组索引不存在");
System.out.println(e.getMessage()); //输出错误原因
//3
System.out.println(e.toString());
//java.lang.ArrayIndexOutOfBoundsException: 3
- 编译时异常—必须显示处理,否则程序不能运行—-父类为Exception
- 运行时异常—无需显示处理,但也可—-父类为RuntimeException
异常处理 — throws 类名
编译时异常,不处理将无法运行
throws 类名 抛出异常 , 谁调用,谁处理
只是抛出,并没有真正处理
public static Date stringToDate(String dateString,String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date1 = sdf.parse(dateString);
//parse方法提示,我可能会出错,必须抛出错误.
//添加 throws ParseException 抛出异常
return date1;
}
自定义异常
extends Exception
/*
自定义异常类
*/
public class ScoreException extends Exception {
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
public class Teacher {
public void checkScore(int score) throws ScoreException {
if (score< 0||score>100){
throw new ScoreException("你的分数超出范围");
}else{
System.out.println("分数正常");
}
}
}
public class Demo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
int score = scanner.nextInt();
Teacher teacher = new Teacher();
try {
teacher.checkScore(score);
} catch (ScoreException scoreException) {
scoreException.printStackTrace();
}
}
}
请输入: 120 fit.itheima_05.DateUtils: 你的分数超出范围 at fit.itheima_05.Teacher.checkScore(Teacher.java:6) at fit.itheima_05.Demo.main(Demo.java:15)
Process finished with exit code 0
Collection 集合
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("hello");
c.add("java");
System.out.println(c);
//重写了toString
//输出 [hello, java]
}
快捷键 ——Alt+7 展示类结构
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
//添加元素
c.add("hello");
c.add("java");
//移除元素
System.out.println(c.remove("hello"));
//判断元素是否存在
System.out.println(c.contains("hello"));
//判断集合是否为空
System.out.println(c.isEmpty());
//获取集合长度
System.out.println(c.size());
System.out.println(c);
}
遍历
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
//添加元素
c.add("hello");
c.add("java");
c.add("你好");
//创建迭代对象
Iterator<String> it = c.iterator();
//判断对象是否存在
while (it.hasNext()){
//输出
System.out.println(it.next());
}
System.out.println(c);
}
List 有序集合 -序列-允许重复
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
System.out.println(list);
Iterator<String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
/*
List 特有方法,注意索引越界问题
*/
//指定位置添加元素
list.add(1,"JavaEE");
System.out.println(list);
//删除指定索引元素,并返回被删除的元素
System.out.println(list.remove(1));
System.out.println(list);
//修改指定索引处元素
System.out.println(list.set(1,"JavaWeb"));
System.out.println(list);
//获取指定索引元素
System.out.println(list.get(1));
//遍历
for (int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
}
并发修改异常
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
if (s.equals("world")){
list.add("javaEE");
}
}
}
Exception in thread “main” java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at fit.itheima_05.Demo.main(Demo.java:14)
Process finished with exit code 1
迭代器 判断作 预期修改值与实际修改值 不同导致
解决:使用for循环遍历
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
for(int i = 0;i<list.size();i++){
String s = list.get(i);
if (s.equals("world")){
list.add("javaEE");
}
}
System.out.println(list);
//[hello, java, world, javaEE]
}
列表迭代器
任意方向开始遍历
sli.add(“javaEE”); 使用 listIterator 对象的add方法,将不会报错
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
ListIterator<String> sli = list.listIterator();
while (sli.hasNext()){
String s = sli.next();
if (s.equals("world")){
sli.add("javaEE");
}
}
System.out.println(list);
}
增强for循环
原理:
底层包装了 迭代器,
所以也会报 并发修改异常
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
for (String ss:list){
if (ss.equals("world")){
list.add("javaEE");
}
}
System.out.println(list);
}
Exception in thread “main” java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at fit.itheima_05.Demo.main(Demo.java:21)
Process finished with exit code 1
数据结构
- 栈 —- 先进后出
- 队列 —- 先进先出
- 数组—-查询快,增删慢
- 链表 —- 查询慢,增删快(对比数组)
//List 子类集合特点
/
ArrayList 底层为数组
LinkedList 底层为链表
/
public static void main(String[] args) {
//List 子类集合特点
/*
ArrayList 底层为数组
LinkedList 底层为链表
*/
List<String> list = new LinkedList<>();
list.add("hello");
list.add("java");
list.add("world");
for (String ss : list) {
System.out.println(ss);
}
System.out.println("-------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------------");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("-------------");
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
System.out.println(lit.next());
}
}
hello java
world
hello java
world
hello java
world
hello java world
Process finished with exit code 0
linkedlist
public static void main(String[] args) {
//List 子类集合特点
/*
ArrayList 底层为数组
LinkedList 底层为链表
*/
LinkedList<String> list = new LinkedList<>();
list.add("hello");
list.add("java");
list.add("world");
/*
LinkedList 特有方法
*/
//在开头添加元素
list.addFirst("javaWEB");
//在末位添加元素,注意add也是在末位添加元素
list.addLast("JavaEE");
System.out.println(list);
//[javaWEB, hello, java, world, JavaEE]
//删除首位元素
System.out.println(list.removeFirst());
//javaWEB
//删除末位元素
System.out.println(list.removeLast());
//JavaEE
System.out.println(list);
//[hello, java, world]
}
Set集合
HashSet:对迭代集合的顺序不作保证,可能会乱
/*
Set集合:
不包含重复元素
不带索引
*/
//HashSet:对迭代集合的顺序不作保证,可能会乱
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("java");
set.add("world");
System.out.println(set);
//[java, world, hello]
set.add("world");
System.out.println(set);
//[java, world, hello]
}
哈希值
/*
哈希值:是JDK根据对象地址或字符串或数字
计算出的int类型的数字
hashCode :返回对象的哈希码值
*/
public static void main(String[] args) {
String s = new String("msd");
String s1 = new String("aaa");
System.out.println(s.hashCode());
//108414
System.out.println(s1.hashCode());
//96321
//默认情况下,不同对象的哈希值不同
//重写hashCode方法可使不同对象的哈希值相同
System.out.println("hello".hashCode());
System.out.println("hello".hashCode());
System.out.println("java".hashCode());
//可能相同
System.out.println("重地".hashCode()); //1179395
System.out.println("通话".hashCode()); //1179395
}
/*
数据结构-->哈希表
*/
public static void main(String[] args) {
//对哈希值 进行16取余
//先对比哈希值,再对比内容
HashSet<Teacher> set = new HashSet<>();
Teacher s1 = new Teacher("张三", 12);
Teacher s2 = new Teacher("李四", 13);
Teacher s3 = new Teacher("王五", 12);
Teacher s4 = new Teacher("李四", 13);
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
System.out.println(set);
//[Teacher{name='王五', age=12}, Teacher{name='李四', age=13}, Teacher{name='张三', age=12}, Teacher{name='李四', age=13}]
/*
发现重复的元素也被添加进来了,是因为没有重写equals方法和hashCode
在teacher类中 重写后
//[Teacher{name='王五', age=12}, Teacher{name='张三', age=12}, Teacher{name='李四', age=13}]
*/
}
LinkedHashSet
/*
LinkedHashSet-->底层结构:链表和哈希表
由链表保证 顺序 有序
由哈希表 保证 元素唯一
*/
public static void main(String[] args) {
LinkedHashSet<String> ss = new LinkedHashSet<>();
ss.add("hello");
ss.add("java");
ss.add("world");
System.out.println(ss);
//[hello, java, world]
ss.add("world");
System.out.println(ss);
//[hello, java, world]
}
TreeSet 集合
/*
TreeSet -->不重复
自然有序
*/
public static void main(String[] args) {
//需使用基本数据类型对应的包装类型
TreeSet<Integer> it = new TreeSet<>();
it.add(20);
it.add(10);
it.add(40);
it.add(30);
it.add(50);
System.out.println(it);
//[10, 20, 30, 40, 50]
it.add(50);
System.out.println(it);
//[10, 20, 30, 40, 50]
}
自然排序 Comparable
public class Teacher implements Comparable<Teacher> {
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
if (age != teacher.age) return false;
return name != null ? name.equals(teacher.name) : teacher.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
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 int compareTo(Teacher o) {
int num = this.age - o.age; //age升序
//int num = o.age - this.age; //age降序
//如年龄相同,比较名字
int num2 = num == 0?this.name.compareTo(o.name):num;
return num2;
}
}
/*
TreeSet -->不重复
自然有序
*/
public static void main(String[] args) {
TreeSet<Teacher> set = new TreeSet<>();
Teacher s1 = new Teacher("张三", 40);
Teacher s2 = new Teacher("李四", 30);
Teacher s3 = new Teacher("王五", 10);
Teacher s4 = new Teacher("李四", 20);
//Teacher s5 = new Teacher("m四", 20);
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
//set.add(s5);
for (Teacher t:set){
System.out.println(t.getName()+","+t.getAge());
}
/*
Exception in thread "main" java.lang.ClassCastException: fit.itheima_05.Teacher cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at fit.itheima_05.Demo.main(Demo.java:18)
Process finished with exit code 1
*/
//teacher类 实现Comparable接口,重写compareTo方法,根据其返回值输出
//return 0; --> [Teacher{name='张三', age=40}]
//return 1; -->
/*
张三,40
李四,30
王五,10
李四,20
*/
//return -1; -->
/*
李四,20
王五,10
李四,30
张三,40
*/
//return (this.age - o.age);
/*
王五,10
李四,20
李四,30
张三,40
*/
}
比较器Comparator 排序
public static void main(String[] args) {
//创建内部类
TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
int num = o1.getAge() - o2.getAge();
int num2 = num == 0?o1.getName().compareTo(o2.getName()):num;
return num;
}
});
Teacher s1 = new Teacher("张三", 40);
Teacher s2 = new Teacher("李四", 30);
Teacher s3 = new Teacher("王五", 10);
Teacher s4 = new Teacher("李四", 20);
//Teacher s5 = new Teacher("m四", 20);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
//set.add(s5);
for (Teacher t:ts){
System.out.println(t.getName()+","+t.getAge());
}
成绩排序输出
泛型
public static void main(String[] args) {
//不指定存储类型
Collection c = new ArrayList();
c.add("hello");
c.add("java");
c.add("world");
c.add(100);
Iterator it = c.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
/*
hello
java
world
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at fit.itheima_05.Test.main(Test.java:16)
Process finished with exit code 1
*/
}
使用泛型
1.避免强制类型转换
2.提前到运行时异常
public static void main(String[] args) {
//指定String存储类型
Collection<String> c = new ArrayList();
c.add("hello");
c.add("java");
c.add("world");
//c.add(100);
Iterator<String> it = c.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
/*
hello
java
world
*/
}
/*
泛型类
*/
public class Generic<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static void main(String[] args) {
Teacher t = new Teacher();
t.setAge(30);
System.out.println(t.getAge());
// t.setAge("string类型"); //报错
// System.out.println(t.getAge());
Generic<String> sg = new Generic<>();
sg.setT("String类型");
System.out.println(sg.getT());
Generic<Integer> ig = new Generic<>();
ig.setT(100);
System.out.println(ig.getT());
}
/*
泛型类
*/
public class Generic<T> {
public void show(T t) {
System.out.println(t);
}
}
public static void main(String[] args) {
Generic g = new Generic<>();
//调用不同类型的数据
g.show("String");
g.show(100);
g.show(true);
g.show(12.56);
}
泛型方法
public class Generic {
/*
泛型方法
*/
public <T> void show(T t) {
System.out.println(t);
}
}
public static void main(String[] args) {
Generic g = new Generic();
//调用不同类型的数据
g.show("String");
g.show(100);
g.show(true);
g.show(12.56);
}
泛型接口
/*
泛型接口
*/
public interface Generic<T> {
void show(T t);
}
/*
泛型接口实现类
*/
public class GenericImpl<T> implements Generic<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
public static void main(String[] args) {
Generic g = new GenericImpl();
//调用不同类型的数据
g.show("String");
g.show(100);
g.show(true);
g.show(12.56);
}
类型通配符
/*
Object-->Number-->Integer
*/
public static void main(String[] args) {
//? 通配所有类型
List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Number>();
List<?> list3 = new ArrayList<Integer>();
//指定上限 : 最高父类只能到 NUmber,不能为Object
List<? extends Number> list4 = new ArrayList<Object>(); //报错
List<? extends Number> list5 = new ArrayList<Number>();
List<? extends Number> list6 = new ArrayList<Integer>();
//指定下限 : 最低子类为 Number,不能更低,即Integer
List<? super Number> list7 = new ArrayList<Object>();
List<? super Number> list8 = new ArrayList<Number>();
List<? super Number> list9 = new ArrayList<Integer>(); //报错
}
可变参数
定义: public static int sum(int… a)
如 一个方法既包含可变参数,有包含普通参数,
可变参数 必须 放在最后
/*
可变参数
*/
public static void main(String[] args) {
System.out.println(sum(1,2));
System.out.println(sum(1,2,3));
System.out.println(sum(1,2,3,4));
}
public static int sum(int... a){
//a 为一个数组[1, 2, 3, 4]
System.out.println(Arrays.toString(a));
int sum = 0;
for (int i :a){
sum+=i;
}
return sum;
}
public static void main(String[] args) {
List<String> list = Arrays.asList("hello", "java", "world");
//不支持添加和删除
// list.add("web");
// list.remove("world");
//java.lang.UnsupportedOperationException
//但是支持修改
list.set(1, "WEB");
System.out.println(list);
}
public static void main(String[] args) {
//List.of JDK9新特性,创建的集合不支持增删改
List<String> list = List.of("hello", "java", "world");
}
public static void main(String[] args) {
//Set.of JDK9新特性,创建的集合不支持增删,没有修改方法
//创建时不能存入重复元素
Set<String> set = Set.of("hello", "java", "world");
}
Map 集合
/*
Map集合
*/
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<>();
map.put("张三","34");
map.put("李四","35");
map.put("王五","36");
System.out.println(map);
//{李四=35, 张三=34, 王五=36}
//当键重复,会覆盖之前的值
map.put("王五","99");
System.out.println(map);
//{李四=35, 张三=34, 王五=99}
}
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<>();
map.put("张三","34");
map.put("李四","35");
map.put("王五","36");
System.out.println(map);
//{李四=35, 张三=34, 王五=36}
System.out.println(map.remove("张三"));
////34
System.out.println(map.remove("35"));
//键不存在 --> null
System.out.println(map);
//{李四=35, 王五=36}
//判断 键是否存在 -->false
System.out.println(map.containsKey("张三"));
//判断 值是否存在 -->true
System.out.println(map.containsValue("35"));
//获取map集合长度 --> 2
System.out.println(map.size());
//清空集合
map.clear();
//判断集合是否为空 -->true
System.out.println(map.isEmpty());
}
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<>();
map.put("张三","34");
map.put("李四","35");
map.put("王五","36");
//根据键 获取值
System.out.println(map.get("张三")); //34
System.out.println(map.get("傻逼")); //null
//获取键的集合
Set<String> mapKey = map.keySet();
System.out.println(mapKey); //[李四, 张三, 王五]
//获取值的集合
Collection<String> mapValue = map.values();
System.out.println(mapValue); //[35, 34, 36]
}
遍历
Set
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<>();
map.put("张三","34");
map.put("李四","35");
map.put("王五","36");
//遍历输出
for (String s :map.keySet()){
System.out.println(s+","+map.get(s));
}
/*
李四,35
张三,34
王五,36
*/
System.out.println("--------------");
//获取键值对集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
System.out.println(entry);
System.out.println(entry.getKey()+","+entry.getValue());
}
/*
李四=35
李四,35
张三=34
张三,34
王五=36
王五,36
*/
}