一.抽象类
抽象类:定义共性功能,继承抽象类,那么抽象类中的抽象方法必须全部实现。
1.抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中
2.抽象类不可以直接创建对象(原因:调用抽象方法没有意义)
3.只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。不然子类也要是抽象类。
4.抽象类一定是父类
5.抽象类中可以不定义抽象方法(意义:静态方法可以直接让子类去使用)
6.关键字不可以和private,final一起用。(final声明的类不允许有子类,private私有的不允许覆写)
7.抽象类中可以没有抽象方法
代码1:
public abstract class Animal { public abstract void eat(); public abstract void sleep(); } class Dog extends Animal{ @Override public void eat() { System.out.println("dog eat"); } @Override public void sleep() { System.out.println("dog sleep"); } } //只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。不然子类也要是抽象类 abstract class Cat extends Animal{ public abstract void catchMouse(); } class LittleCat extends Cat{ @Override public void eat() { System.out.println("little cat eat"); } @Override public void sleep() { System.out.println("little cat sleep"); } @Override public void catchMouse() { System.out.println("little cat catch"); } }
代码2:
package com.atguigu.day10; public abstract class Animal { String name; int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } public abstract void eat(); public abstract void sleep(); @Override public String toString() { return "name:"+name+" age:"+age; } } class Dog extends Animal{ public Dog() { } public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("dog eat"); } @Override public void sleep() { System.out.println("dog sleep"); } } //只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。不然子类也要是抽象类 abstract class Cat extends Animal{ public abstract void catchMouse(); } class LittleCat extends Cat{ @Override public void eat() { System.out.println("little cat eat"); } @Override public void sleep() { System.out.println("little cat sleep"); } @Override public void catchMouse() { System.out.println("little cat catch"); } }
main
package com.atguigu.day10; public class Test { public static void main(String args[]) { Dog dog1= new Dog(); dog1.name="lin1"; dog1.age=23; System.out.println(dog1); Dog dog2= new Dog("lin2",14); System.out.println(dog2); } }
输出
name:lin1 age:23
name:lin2 age:14
二.接口
接口:用于拓展性
1.包含了功能声明的特殊类。 2.定义格式:public interface 接口名{} 使用格式:class A implements 接口名{} 3.接口中可以定义成员变量,但变量只能是最终变量,并且是静态的。默认修饰符:public static final。 4.接口中可以定义方法,但只能是抽象方法。接口中的方法默认被public abstract修饰
5.接口中没有构造方法,不可以创建对对象。
6.子类必须覆盖掉接口中所有的抽象方法,子类才可以实例化。
7.多个接口之间可以使用extends进行多继承,如果一个类继承了,实现了多个接口的接口,不仅要实现此接口的抽象方法,也要实现继承接口的抽象方法
8.类可以实现多个接口
代码:
public interface Fly { int num=20; void fly(); } interface Eats{ void eat(); } class Superman implements Fly{ @Override public void fly() { System.out.println("super man fly"); } } class Bird implements Fly,Eats{ @Override public void fly() { System.out.println("bird fly"); } @Override public void eat() { System.out.println("bird eat"); } }
main
public class Test { public static void main(String args[]) { Superman s1 = new Superman(); s1.fly(); Bird b1 = new Bird(); b1.fly(); b1.eat(); //接口的多态 Fly f1 = new Bird(); f1.fly(); //接口中的成员变量被public static final修饰 System.out.println(Fly.num); } }
输出
super man fly bird fly bird eat bird fly 20
代码2:
public interface Fly { int num=20; void fly(); //jdk8提供的,jdk8以后在接口中可以使用此方法,给继承接口的类按需选择使用 public default void addOil(){ System.out.println("add oil"); } //也可以有静态方法 public static void show(){ System.out.println("fly show"); } } interface Eats{ void eat(); } class Superman implements Fly{ @Override public void fly() { System.out.println("super man fly"); } @Override public void addOil() { System.out.println("super man add oil"); } } class Bird implements Fly,Eats{ @Override public void fly() { System.out.println("bird fly"); } @Override public void eat() { System.out.println("bird eat"); } }
main:
package com.atguigu.day10; public class Test { public static void main(String args[]) { Superman s1 = new Superman(); s1.fly(); //s1按需选择使用addOil s1.addOil(); Bird b1 = new Bird(); b1.fly(); b1.eat(); //接口的多态 Fly f1 = new Bird(); f1.fly(); //接口中的成员变量被public static final修饰 System.out.println(Fly.num); //静态方法 Fly.show(); } }
输出
super man fly super man add oil bird fly bird eat bird fly 20 fly show
三.接口特殊情况
package com.atguigu.day10; interface Study { public default void study(){ System.out.println("just study"); } } interface HardStudy { public default void study(){ System.out.println("just sing"); } } class Students implements Study,HardStudy{ @Override public void study() { System.out.println("self study"); //可以在重写的方法中通过接口名.super.方法名调用 Study.super.study(); HardStudy.super.study(); } }
main
package com.atguigu.day10; public class Test { public static void main(String args[]) { Students st1 = new Students(); st1.study(); } }
输出
self study
just study
just sing
四.comparable接口
目前对象.compareTo(需要比较的对象)
Comparable接口的声明以及作用,可以看到它可以使继承他的类进行比较大小,只需要调用实现类的compareTo方法即可
实现比较大小: 如果返回值等于零:o1=o2 返回值大于零则o1>o2 返回值小于于零则o1<o2
代码:
package com.atguigu.day10; class P implements Comparable<P> { String name; int age; public P(String name,int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(P o) { return this.age-o.age; } }
main
public class ComparableTest { public static void main(String[] args) { P[] personList = new P[4]; personList[0] = (new P("lin1", 22)); personList[1] = (new P("lin2", 21)); personList[2] = (new P("lin3", 36)); personList[3] = (new P("lin4", 20)); System.out.println("比较大小"); P lin1 = new P("lin1", 22); P lin2 = new P("lin2", 21); String result = lin1.compareTo(lin2) == 0 ? "一样大" : lin1.compareTo(lin2) > 0 ? "lin1大" : "lin2大"; System.out.println(result); } }
输出
比较大小
lin1大
引用数据类型比较
Comparable:内部比较器
在比较对象类的内部,完成了比较规则的制定
Comparabtor:外部比较器
Comparable代码
package com.atguigu.day10; public class FlyMan implements Comparable{ String name; int age; int height; 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 int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public FlyMan() { } public FlyMan(String name, int age, int height) { this.name = name; this.age = age; this.height = height; } @Override public String toString() { return "name:"+name+" age:"+age+" height:"+height; } @Override public int compareTo(Object o) { FlyMan f = (FlyMan) o; return this.height-f.height; } }
package com.atguigu.day10; public class WorkMan implements Comparable{ String name; int age; public WorkMan() { } public WorkMan(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 "name:"+name+" age:"+age; } @Override public int compareTo(Object o) { WorkMan workMan = (WorkMan) o; return this.age-workMan.age; } }
package com.atguigu.day10.Utils; public class SortArry { public static void sort(Comparable[] arr){ for (int i = 0; i <arr.length-1 ; i++) { for (int j = 0; j < arr.length-1-i; j++) { if (arr[j].compareTo(arr[j+1])>0) { Comparable temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } }
package com.atguigu.day10; import com.atguigu.day10.Utils.SortArry; public class CompareTest { public static void main(String[] args) { FlyMan f1= new FlyMan("lin1",23,177); FlyMan f2= new FlyMan("lin2",28,183); FlyMan f3= new FlyMan("lin3",19,182); FlyMan f4= new FlyMan("lin4",24,181); FlyMan[] fly1= {f1,f2,f3,f4}; WorkMan w1 = new WorkMan("yang1",25); WorkMan w2 = new WorkMan("yang2",20); WorkMan w3 = new WorkMan("yang3",23); WorkMan w4 = new WorkMan("yang4",22); WorkMan[] work1 = {w1,w2,w3,w4}; System.out.println("fly1排序前-------------------"); for (int i = 0; i < fly1.length; i++) { System.out.println(fly1[i]); } System.out.println("fly1排序后-------------------"); SortArry.sort(fly1); for (int i = 0; i <fly1.length ; i++) { System.out.println(fly1[i]); } System.out.println("work1排序前-------------------"); for (int i = 0; i <work1.length ; i++) { System.out.println(work1[i]); } System.out.println("work1排序前-------------------"); SortArry.sort(work1); for (int i = 0; i <work1.length ; i++) { System.out.println(work1[i]); } } }
输出
fly1排序前------------------- name:lin1 age:23 height:177 name:lin2 age:28 height:183 name:lin3 age:19 height:182 name:lin4 age:24 height:181 fly1排序后------------------- name:lin1 age:23 height:177 name:lin4 age:24 height:181 name:lin3 age:19 height:182 name:lin2 age:28 height:183 work1排序前------------------- name:yang1 age:25 name:yang2 age:20 name:yang3 age:23 name:yang4 age:22 work1排序前------------------- name:yang2 age:20 name:yang4 age:22 name:yang3 age:23 name:yang1 age:25
Comparabtor
代码1:
package com.atguigu.day10; public class TeacherTest { public static void mineSort(Teacher[] ts,TeacherSortOfAge sortOfAge){ for (int i = 0; i <ts.length-1 ; i++) { for (int j = 0; j <ts.length-i-1 ; j++) { if(sortOfAge.compare(ts[j],ts[j+1])>0){ Teacher temp=ts[j]; ts[j]=ts[j+1]; ts[j+1]=temp; } } } } public static void main(String[] args) { Teacher t1 = new Teacher("lin1",18,100.0); Teacher t2 = new Teacher("lin2",12,101.0); Teacher t3 = new Teacher("lin3",19,90.0); Teacher t4 = new Teacher("lin4",16,103.0); Teacher t5 = new Teacher("lin5",22,87.0); Teacher[] ts={t1,t2,t3,t4,t5}; System.out.println("排序前--------------------"); for (int i = 0; i <ts.length ; i++) { System.out.println(ts[i].toString()); } System.out.println("排序后--------------------"); TeacherSortOfAge tsoa = new TeacherSortOfAge(); mineSort(ts,tsoa); for (int i = 0; i <ts.length ; i++) { System.out.println(ts[i].toString()); } } }
package com.atguigu.day10; /* 使用外部比较器比较: 在比较对象的外面新建了一个类专门用于比较 1.定义一个类,实现Comparator接口 2.重写compare()传递连个参数 3.定制比较规则 4.先去创建比较规则的对象,通过对象调用compare()再传入对象 */ import java.util.Comparator; public class TeacherSortOfAge implements Comparator { @Override public int compare(Object o1, Object o2) { Teacher p1 =(Teacher) o1; Teacher p2 = (Teacher) o2; return p1.age-p2.age; } }
代码2:
package com.atguigu.day10; import java.util.Comparator; public class TeacherSortOfAgeAndSalary implements Comparator{ @Override public int compare(Object o1, Object o2) { Teacher p1 =(Teacher) o1; Teacher p2 = (Teacher) o2; //当年龄相等 if(p1.age==p2.age){ return Double.compare(p1.salary,p2.salary); } return p1.age-p2.age; } }
package com.atguigu.day10.Utils; import java.util.Comparator; public class SortUtils { public static void sort(Object[] objArr, Comparator com){ for (int i = 0; i < objArr.length-1; i++) { for (int j = 0; j <objArr.length-i-1 ; j++) { if(com.compare(objArr[j],objArr[j+1])>0){ Object temp=objArr[j]; objArr[j]=objArr[j+1]; objArr[j+1]=temp; } } } } }
package com.atguigu.day10; import com.atguigu.day10.Utils.SortUtils; public class TeacherTest { public static void mineSort(Teacher[] ts,TeacherSortOfAge sortOfAge){ for (int i = 0; i <ts.length-1 ; i++) { for (int j = 0; j <ts.length-i-1 ; j++) { if(sortOfAge.compare(ts[j],ts[j+1])>0){ Teacher temp=ts[j]; ts[j]=ts[j+1]; ts[j+1]=temp; } } } } public static void main(String[] args) { Teacher t1 = new Teacher("lin1",18,100.0); Teacher t2 = new Teacher("lin2",12,101.0); Teacher t3 = new Teacher("lin3",18,90.0); Teacher t4 = new Teacher("lin4",16,103.0); Teacher t5 = new Teacher("lin5",16,87.0); Teacher[] ts={t1,t2,t3,t4,t5}; System.out.println("排序前--------------------"); for (int i = 0; i <ts.length ; i++) { System.out.println(ts[i].toString()); } System.out.println("排序后--------------------"); TeacherSortOfAgeAndSalary tsoas = new TeacherSortOfAgeAndSalary(); SortUtils.sort(ts,tsoas); for (int i = 0; i <ts.length ; i++) { System.out.println(ts[i].toString()); } } }
输出
排序前-------------------- name:lin1 age:18 salary:100.0 name:lin2 age:12 salary:101.0 name:lin3 age:18 salary:90.0 name:lin4 age:16 salary:103.0 name:lin5 age:16 salary:87.0 排序后-------------------- name:lin2 age:12 salary:101.0 name:lin5 age:16 salary:87.0 name:lin4 age:16 salary:103.0 name:lin3 age:18 salary:90.0 name:lin1 age:18 salary:100.0