类名作为形参和返回值
方法的形参是类名,其实需要的是该类的对象
方法的返回值是类名,其实返回的是该类的对象
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package unit_16xingcanhefanhuizhi.test1;public class CatOperator { public void useCat (Cat c) { c.eat(); } public Cat getCat () { Cat c = new Cat(); return c; } }
1 2 3 4 5 6 7 8 9 10 package unit_16xingcanhefanhuizhi.test1;public class Cat { public void eat () { System.out.println("猫吃鱼" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package unit_16xingcanhefanhuizhi.test1;public class CatDemo { public static void main (String[] args) { CatOperator co = new CatOperator(); Cat c = new Cat(); co.useCat(c); Cat c2 = co.getCat(); c2.eat(); } }
抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是改抽象类的子类对象
方法的返回值是抽象类名,其实返回的是改抽象类的子类对象
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package unit_16xingcanhefanhuizhi.test2;public class AnimalOperator { public void useAnimal (Animal a) { a.eat(); } public Animal getAnimal () { Animal a = new Cat(); return a; } }
1 2 3 4 5 6 7 8 package unit_16xingcanhefanhuizhi.test2;public abstract class Animal { public abstract void eat () ; }
1 2 3 4 5 6 7 8 9 10 11 package unit_16xingcanhefanhuizhi.test2;public class Cat extends Animal { @Override public void eat () { System.out.println("猫吃鱼" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package unit_16xingcanhefanhuizhi.test2;public class AnimalDemo { public static void main (String[] args) { AnimalOperator ao = new AnimalOperator(); Animal a = new Cat(); ao.useAnimal(a); Animal a2 = ao.getAnimal(); a2.eat(); } }
接口名作为形参和返回值
方法的形参是接口名,其实需要的是该接口的实现类对象
方法的返回值是接口名,其实返回的是该接口的实现类对象
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package unit_16xingcanhefanhuizhi.test3;public class JumppingOperator { public void useJumpping (Jumpping j) { j.jump(); } public Jumpping getJumpping () { Jumpping j = new Cat(); return j; } }
1 2 3 4 5 6 7 8 package unit_16xingcanhefanhuizhi.test3;public interface Jumpping { void jump () ; }
1 2 3 4 5 6 7 8 9 10 11 package unit_16xingcanhefanhuizhi.test3;public class Cat implements Jumpping { @Override public void jump () { System.out.println("猫可以跳了" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package unit_16xingcanhefanhuizhi.test3;public class JumppingDemo { public static void main (String[] args) { JumppingOperator jo = new JumppingOperator(); Jumpping j = new Cat(); jo.useJumpping(j); Jumpping j2 = jo.getJumpping(); j2.jump(); } }
内部类概述
内部类:就是在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被成为内部类
内部类的定义格式
1 2 3 4 5 public class 类名 { 修饰符 class 类名 { } }
1 2 3 4 5 6 public class Outer { public class Inner { } }
内部类的访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
范例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package unit_17InnerClass.test1;public class Outer { private int num = 10 ; public class Inner { public void show () { System.out.println(num); } } public void method () { Inner i = new Inner(); i.show(); } }
成员内部类
按照内部类在类中定义的位置不同,可以分为如下两种形式
在类的成员位置:成员内部类
在类的局部位置:局部内部类
成员内部类,外界如何创建对象使用呢?
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
范例:Outer.Inner oi = new Outer().new Inner();
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package unit_17InnerClass.test2;public class Outer { private int num = 10 ; private class Inner { public void show () { System.out.println(num); } } public void method () { Inner i = new Inner(); i.show(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package unit_17InnerClass.test2;public class InnerDemo { public static void main (String[] args) { Outer o = new Outer(); o.method(); } }
局部内部类
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package unit_17InnerClass.test3;public class Outer { private int num = 10 ; public void method () { int num2 = 20 ; class Inner { public void show () { System.out.println(num); System.out.println(num2); } } Inner i = new Inner(); i.show(); } }
1 2 3 4 5 6 7 8 9 10 package unit_17InnerClass.test3;public class OuterDemo { public static void main (String[] args) { Outer o = new Outer(); o.method(); } }
匿名内部类
前提:存在以恶搞类或者接口,这里的类可以是具体类也可以是抽象类
1 2 3 4 5 new 类名或者接口名(){ 重写方法; };
1 2 3 4 5 6 new Inter(){ public void show () { } }
本质:是一个继承了该类或者实现类该接口的子类匿名对象
代码
1 2 3 4 5 6 7 8 package unit_17InnerClass.test4;public interface Inter { void show () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package unit_17InnerClass.test4;public class Outer { public void method () { Inter i = new Inter(){ @Override public void show () { System.out.println("匿名内部类" ); } }; i.show(); } }
1 2 3 4 5 6 7 8 9 10 package unit_17InnerClass.test4;public class OuterDemo { public static void main (String[] args) { Outer o = new Outer(); o.method(); } }
匿名内部类在开发中的使用
1 2 3 4 5 6 public interface Jumpping { void jump () ; }
1 2 3 4 5 6 7 8 public class JumppingOperator { public void method (Jumpping j) { j.jump(); } }
1 2 3 4 5 6 7 8 public class JumppingDemo { public static void main (String[] args) { } }
代码
1 2 3 4 5 6 7 8 package unit_17InnerClass.test5;public interface Jumpping { void jump () ; }
1 2 3 4 5 6 7 8 9 10 package unit_17InnerClass.test5;public class JumppingOperator { public void method (Jumpping j) { j.jump(); } }
1 2 3 4 5 6 7 8 9 10 11 package unit_17InnerClass.test5;public class Cat implements Jumpping { @Override public void jump () { System.out.println("猫可以跳了" ); } }
1 2 3 4 5 6 7 8 9 10 11 package unit_17InnerClass.test5;public class Dog implements Jumpping { @Override public void jump () { System.out.println("狗可以跳了" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package unit_17InnerClass.test5;public class JumppingDemo { public static void main (String[] args) { JumppingOperator jo = new JumppingOperator(); Jumpping j = new Cat(); jo.method(j); Jumpping j2 = new Dog(); jo.method(j2); System.out.println("----------------------" ); jo.method(new Jumpping() { @Override public void jump () { System.out.println("猫可以跳了" ); } }); jo.method(new Jumpping() { @Override public void jump () { System.out.println("狗可以跳了" ); } }); } }