abstract class Animal {
public String name;
public int age;
private void test() {
}
}abstract class Animal {
public String name;
public int age;
private void test() {
}
public abstract void eat();
}abstract class Animal {
public String name;
public int age;
private void test() {
}
public abstract void eat();
}
public class Test {
public static void main(String[] args) {
// Animal animal = new Animal(); **error**
Animal animal = new Dog();
}
}abstract class Animal {
public String name;
public int age;
private void test() {
}
public abstract void eat();
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}public class Dog extends Animal {
@Override
public void eat() {
this.name = "旺财";
this.age = 3;
System.out.println(age + " 岁的 " + name + " 正在吃狗粮!");
}
}
abstract class Animal {
public String name;
public int age;
private void test() {
}
public abstract void eat();
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
abstract class Dog1 extends Animal{
public String kinds;
public Dog1(String name, int age) {
super(name, age);
}
public abstract void setKinds();
}
class Teddy extends Dog1{
public Teddy(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(name + "正在吃狗粮!");
}
@Override
public void setKinds() {
kinds = "泰迪狗";
System.out.println("种类是: " + kinds);
}
}
public class Test {
public static void main(String[] args) {
Teddy teddy = new Teddy("泰迪",10);
teddy.eat();
teddy.setKinds();
}
}




public interface Fly {
public abstract void fly();
}
public interface Run {
public static final int age = 10;
}
public class chicken implements Fly,Run{
public String name = "功夫鸡";
@Override
public void fly() {
System.out.println(name + " 正在飞~");
}
@Override
public void run() {
System.out.println(name + " 正在满院跑~");
}
}

public interface Swim {
void swim();
default void tmp1() {
System.out.println("这是一个default修饰的方法");
}
public static void tmp2() {
System.out.println("这是一个public static修饰的方法");
}
private static void tmp3() {
System.out.println("这是一个private static修饰的方法");
}
}
public class Fish implements Swim{
public String name = "锦鲤";
@Override
public void swim() {
System.out.println(this.name + " 正在水里游来游去~");
}
public void rat() {
}
public static void main(String[] args) {
Swim swim = new Fish();
}
}
抽象类 | 接口 |
|---|---|
用abstract修饰 | 用interface修饰 |
有构造方法 | 没有构造方法 |
有普通成员方法,可以有具体实现 | 默认是抽象方法,不可以有具体实现,只有static与default修饰的方法才能有具体实现 |
有普通成员变量 | 成员变量全被public static final修饰 |
子类用extends来继承抽象类 | 类用implements来实现接口的功能 |
抽象类与抽象类之间用extends来继承,且不能多继承 | 接口与接口之间用extends来拓展多个接口的功能 |
当克隆对象的成员变量中含有另一个类或对象的引用,通过clone1克隆clone2那么在克隆过程中,改变clone1所指的成员变量中的引用里所指的值,clone2也随之改变,称之为浅拷贝


class Name {
public String name = "天才";
}
public class Clone implements Cloneable {
public int age = 18;
public Name N = new Name();
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Clone{" +
"age=" + age + ", name=" + N.name+
'}';
}
}
class Test{
public static void main(String[] args) throws CloneNotSupportedException {
Clone clone1 = new Clone();
Clone clone2 = (Clone) clone1.clone();
System.out.println(clone1);
System.out.println(clone2);
System.out.println("---------------");
clone1.N.name = "王八";
System.out.println(clone1);
System.out.println(clone2);
}
}当克隆对象的成员变量中含有另一个类或对象的引用,通过clone1克隆clone2那么在克隆过程中,改变clone1所指的成员变量中的引用里所指的值,clone2不会随之改变,称之为深拷贝


class Name implements Cloneable{
public String name = "天才";
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Clone implements Cloneable {
public int age = 18;
public Name N = new Name();
@Override
protected Object clone() throws CloneNotSupportedException {
Clone tmp = (Clone) super.clone();
tmp.N =(Name) this.N.clone();
return tmp;
}
@Override
public String toString() {
return "Clone{" +
"age=" + age + ", name=" + N.name+
'}';
}
}
class Test{
public static void main(String[] args) throws CloneNotSupportedException {
Clone clone1 = new Clone();
Clone clone2 = (Clone) clone1.clone();
System.out.println(clone1);
System.out.println(clone2);
System.out.println("---------------");
clone1.N.name = "王八";
System.out.println(clone1);
System.out.println(clone2);
}
}在类中用static修饰的内部类

静态内部类中不能直接访问外部类的非静态成员变量和方法 需要访问的话,要在静态内部类中实例化外部类对象
class Outer {
public static String a;
private int b;
public int c;
static class Node{
public Node prev;
public Node next;
Outer outer = new Outer();
public void fac() {
a = "天才";
outer.eat();
}
}
public void eat() {
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
}
}在类中不加修饰词的内部类

实例内部类中可以直接访问外部类所有的成员变量与方法
class Outer {
public static String a;
private int b;
public int c;
class Node{
public Node prev;
public Node next;
public void fac() {
a = "天才";
b = 1;
c = 2;
eat();
}
}
public void eat() {
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Node node = outer.new Node(); // 方式一
Outer.Node node1 = new Outer().new Node(); // 方式二
}
}定义在方法中的内部类
只在该方法中能调通,生命周期伴随方法销毁而结束
public void fac() {
class Node {
public Node a;
public Node b;
}
}在实例化类的同时定义类

只能用一次,通常设置比较器用的多
class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("ran",18);
Person person2 = new Person("liu",20);
Person person3 = new Person("zzz",17);
Person[] people = new Person[3];
people[0] = person1;
people[1] = person2;
people[2] = person3;
Comparator<Person> Age_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
Comparator<Person> Name_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.name.compareTo(o2.name);
}
};
Arrays.sort(people,Name_comparator);
System.out.println(Arrays.toString(people));
}
}实现comparable接口中要重写compareTo方法,又因为compareTo只有一个参数,所以是用在需要比较的类当中实现comparable接口来进行比较的
只能比较单一属性,当需要比较多个属性的时候,comparable接口无法实现该功能
class Person implements Comparable<Person> {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("ran",18);
Person person2 = new Person("liu",20);
Person person3 = new Person("zzz",17);
Person[] people = new Person[3];
people[0] = person1;
people[1] = person2;
people[2] = person3;
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
}
实现comparator接口要实现compare方法,该方法有两个参数,因此是定义在需要比较的类的外面的
可以根据类的多个属性,来设置不同的比较器,排序时,直接调用需要的比较器即可
class Person /*implements Comparable<Person>*/ {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/* @Override
public int compareTo(Person o) {
return this.age - o.age;
}*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("ran",18);
Person person2 = new Person("liu",20);
Person person3 = new Person("zzz",17);
Person[] people = new Person[3];
people[0] = person1;
people[1] = person2;
people[2] = person3;
Comparator<Person> Age_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
Comparator<Person> Name_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.name.compareTo(o2.name);
}
};
Arrays.sort(people,Name_comparator);
System.out.println(Arrays.toString(people));
}
}
class Person /*implements Comparable<Person>*/ {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/* @Override
public int compareTo(Person o) {
return this.age - o.age;
}*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("ran",18);
Person person2 = new Person("liu",20);
Person person3 = new Person("zzz",17);
Person[] people = new Person[3];
people[0] = person1;
people[1] = person2;
people[2] = person3;
Comparator<Person> Age_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
Comparator<Person> Name_comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.name.compareTo(o2.name);
}
};
Arrays.sort(people,Age_comparator);
System.out.println(Arrays.toString(people));
}
}
这篇博客按照所学知识,从抽象类到接口再到内部类,再用接口与内部类实现比较器,层序渐进慢慢展开,希望能对你有所帮助,如果大佬们发现有错误可以留言指出