Java:抽象类&接口&内部类&Lambda

2023-05-14  本文已影响0人  iOS_修心

一.抽象类

抽象方法:

抽象类:

抽象类特点

public abstract class Animal {
    public void drink(){
        System.out.println("喝水");
    }

    public Animal(){

    }

    public abstract void eat();
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}
public static void main(String[] args) {
        Dog d = new Dog();
        d.eat();
        d.drink();

        Cat c = new Cat();
        c.eat();
        c.drink();
        //Animal a = new Animal();
        //a.eat();
    }
狗吃肉
喝水
猫吃鱼
喝水

二.接口

当一个类中的所有方法都是抽象方法的时候,我们就可以将其定义为接口

1.声明

2.特点

JDK8版本后

实例
public interface Inter {
    public static final int NUM = 10;

    public abstract void show();
}
class InterImpl implements Inter{

    public void method(){
        // NUM = 20;
        System.out.println(NUM);
    }

    public void show(){

    }
}
public class TestInterface {
    /*
        成员变量: 只能是常量 系统会默认加入三个关键字
                    public static final
        构造方法: 没有
        成员方法: 只能是抽象方法, 系统会默认加入两个关键字
                    public abstract
     */
    public static void main(String[] args) {
        System.out.println(Inter.NUM);
    }
  
}

类和接口的关系

接口与父类冲突

三.内部类

在一个类中定义一个类。举例:在一个A类的内部定义一个B类, B类就被称为内部类

public class Outer {
     public class Inner {
     }  
}
内部类的访问特点

成员内部类

将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

   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();
       }
   }
   public class InnerDemo {
       public static void main(String[] args) {
           //Outer.Inner oi = new Outer().new Inner();
           //oi.show();
           Outer o = new Outer();
           o.method();
       }
   }

匿名内部类

是一个继承了该类或者实现了该接口的子类匿名对象

interface Inter{
    void method();
}

class Test{
    public static void main(String[] args){
        new Inter(){
            @Override
            public void method(){
                System.out.println("我是匿名内部类");
            }
        }.method(); // 直接调用方法
    }
}

匿名内部类在开发中的使用

当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码

/*
    游泳接口
 */
interface Swimming {
    void swim();
}

public class TestSwimming {
    public static void main(String[] args) {
        goSwimming(new Swimming() {
            @Override
            public void swim() {
                System.out.println("铁汁, 我们去游泳吧");
            }
        });
    }

    /**
     * 使用接口的方法
     */
    public static void goSwimming(Swimming swimming){
        /*
            Swimming swim = new Swimming() {
                @Override
                public void swim() {
                    System.out.println("铁汁, 我们去游泳吧");
                }
            }
         */
        swimming.swim();
    }
}

四:Lambda表达式

1.格式 :

2.使用前提

实例1:有参有返回值
interface Flyable {
   String fly(String s);
}

class FlyableDemo {
   public static void main(String[] args) {
       //在主方法中调用useFlyable方法
       //匿名内部类
       useFlyable(new Flyable() {
           @Override
           public String fly(String s) {
               s =  s + "晴空万里";
               System.out.println(s);
               return  s ;
           }
       });
       System.out.println("--------");

       //Lambda
       useFlyable((String s) -> {
           s =  "Lambda:" + s + "晴空万里";
           System.out.println(s);
           return s;
       });

   }

   private static void useFlyable(Flyable f) {
       f.fly("Override:风和日丽,");
   }
}
实例2:表达式的省略模式
interface Addable {
    int add(int x, int y);
}

interface Flyable {
    void fly(String s);
}

public class LambdaDemo {
    public static void main(String[] args) {
        // 1.参数的类型可以省略
//        useAddable((int x,int y) -> {
//            return x + y;
//        });
        useAddable((x, y) -> {
            return x + y;
        });

//        useFlyable((String s) -> {
//            System.out.println(s);
//        });
        //2.如果参数有且仅有一个,那么小括号可以省略
//        useFlyable(s -> {
//            System.out.println(s);
//        });

        //3.如果代码块的语句只有一条,可以省略大括号和分号
        useFlyable(s -> System.out.println(s));

        //4.如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉
        useAddable((x, y) -> x + y);
    }
    //接口的实现
    private static void useFlyable(Flyable f) {
        f.fly("风和日丽,晴空万里");
    }

    private static void useAddable(Addable a) {
        int sum = a.add(10, 20);
        System.out.println(sum);
    }
}

3.Lambda表达式和匿名内部类的区别

上一篇 下一篇

猜你喜欢

热点阅读