Java学习-Day04-抽象类与接口

2018-03-26  本文已影响0人  Indomi

知识要点-面向对象

1.抽象方法和抽象类

//定义一个Shape抽象类
public abstract class Shape{
    {
        System.out.println("执行Shape的初始化块");
    }
    private String color;
    //定义一个计算周长的抽象方法
    public abstract double calPerimeter();
    //定义一个返回形状的抽象方法
    public abstract String getType();
    //定义Shape的构造器,该构造器并不是用于创建Shape对象
    //而是用于被子类调用
    public Shape(){}
    public Shape(String color){
        System.out.println("执行Shape的构造器");
        this.color = color;
    }
}
//下面定义一个三角形类,三角形类被定义成普通类
public class Triangle extends Shape{
    //定义三角形的三边
    private double a;
    private double b;
    private double c;
    public Triangle(String color, double a,double b,double c){
        super(color);
        this.setSides(a,b,c);
    }
    public void setSides(double a,double b,double c){
        if (a >= b + c || b >= a + c || c>= a + b){
            System.out.println("三角形两边之和必须大于第三边");
            return;
        }
        this.a = a;
        this.b = b;
        this.c = c;
    }
    //重写Shape类的计算周长的抽象方法
    public double calPerimeter(){
        return a+b+c;
    }
    //重写Shape类的返回形状的抽象方法
    public String getType(){
        return "三角形";
    }
}
//下面定义一个Circle类,也是Shape的一个子类
    public class Circle extends Shape{
        private double radius;
        public Circle(String color, double radius){
            super(color);
            this.radius = radius;
        }
        public void setRadius(double radius){
            this.radius = radius;
        }
        //重写Shape类的计算周长的抽象方法
        public double calPerimeter(){
            return 2 * Math.PI * radius;
        }
        //重写Shape类的返回形状的抽象方法
        public String getType(){
            return getColor() + "圆形";
        }
        public static void main(String[] args){
            Shape s1 = new Triangle("黑色",3,4,5);
            Shape s2 = new Circle("黄色",3);
            System.out.println(s1.getType());
            System.out.println(s1.calPerimeter());
            System.out.println(s2.getType());
            System.out.println(s2.calPerimeter());
        }
    }

抽象类体现的是一种模板模式的设计,作为多个子类的通用模板

2.接口

[修饰符] interface 接口名 extends 父接口1,父接口2...{
  零到多个常量定义...
  零到多个抽象方法定义...
  零到多个内部类,接口,枚举定义...
  零到多个默认方法或类方法定义...
}
[修饰符] class 类名 extends 父类 implements 接口1,接口2....{
  类体部分
  //implements必须放在extends之后
}
    //一个实现接口的类
    //定义一个Product接口
    interface Output{
        //接口里定义的成员变量只能是常量
        int MAX_CACHE_LINE = 50;
        //接口里定义的普通方法只能是public的抽象方法
        void out();
        void getData(String msg);
        //在接口中定义默认方法,需要使用default修饰
        default void print(String... msgs){
            for(String msg : msgs){
                System.out.println(msg);
            }
        }
        //在接口中定义默认方法,需要使用default修饰
        default void test(){
            System.out.println("默认的test()方法");
        }
        //加接口中定义类方法,需要使用static修饰
        static String staticTest(){
            return "接口里的类方法";
        }
    }
    interface Product{
        int getProduceTime();
    }
    //让Printer类实现Output和Product接口
    public class Printer implements Output, Product{
        private String[] printData = new String[MAX_CACHE_LINE];
        //用来记录当前需打印的作业数
        private int dataNum = 0;
        public void out(){
            //只要还有作业,就继续打印
            while (dataNum > 0){
                System.out.println("打印机打印:"+ printData[0]);
                //把作业队列整体前移一位,并将剩下的作业数减1
                System.arraycopy(printData,1,printData,0,--dataNum);
            }
        }
        public void getData(String msg){
            if(dataNum >= MAX_CACHE_LINE){
                System.out.println("输出队列已满,添加失败");
            }else {
                //把打印数据添加到队列里,已保存的数量加1
                printData[dataNum++] = msg;
            }
        }
        public int getProduceTime(){
            return 45;
        }
        public static void main(String[] args){
            //创建一个Printer对象,当成Output使用
            Output o = new Printer();
            o.getData("轻量级Java学习");
            o.out();
            //调用Output接口中定义的默认方法
            o.print("孙悟空","猪八戒");
            o.test();
            //擦行间一个Printer对象,当成Product使用
            Product p = new Printer();
            System.out.println(p.getProduceTime());
            //所有接口类型的引用变量都可以直接赋给Object类型的变量
            Object obj = p;
        }
    }

3.接口和抽象类比较
它们都有如下特征:

区别:

除此之外,还有如下差别


差异点

4.面向接口编程

5.内部类(嵌套类)

    public class Cow{
        private double weight;
        //外部类的两个重载的构造器
        public Cow(){}
        public Cow(double weight){
            this.weight = weight;
        }
        //定义一个非静态内部类
        private class CowLeg{
            //非静态内部类的两个实例变量
            private double length;
            private String color;
            //非静态内部类的两个重载的构造器
            public CowLeg(){}
            public CowLeg(double length,String color){
                this.length = length;
                this.color = color;
            }

            public double getLength() {
                return length;
            }

            public String getColor() {
                return color;
            }

            public void setLength(double length) {
                this.length = length;
            }

            public void setColor(String color) {
                this.color = color;
            }

            //非静态内部类的实例方法
            public void info(){
                System.out.println("当前牛腿颜色是:" + color + ",高:" + length);
                //直接访问外部类的private修饰的成员变量
                System.out.println("本牛腿所在奶牛重:" + weight);
            }
        }
        public void test(){
            CowLeg cl = new CowLeg(1.12,"黑白相间");
            cl.info();
        }
        public static void main(String[] args){
            Cow cow = new Cow(378.9);
            cow.test();
        }
    }

6.Java 8改进的匿名内部类

new 实现接口() | 父类构造器(实参列表){
  //匿名内部类的类体成分
}

7.Java 8 新增的Lambda表达式

8.Lambda表达式与函数式接口

//Runnable接口中只包含一个无参数的方法
//Lambda表达式代表的匿名方法实现了Runnable接口中唯一的,无参数的方法
//因此下面的Lambda表达式创建了一个Runnable对象
Runnable r = () -> {
  for(int i = 0; i < 100; i ++){
    System.out.println();
  }
}

9.方法引用和构造器引用

Lambda表达式支持的方法引用和构造器引用

10.枚举类

public enum SeasonEnum{
  //在第一行列出四个枚举实例
  SPRING,SUMMER,FALL,WINNER;
}

11.对象与垃圾回收

12.强制垃圾回收

13.finalize方法

特点:

14.对象的软,弱,虚引用

15.修饰符的适用范围

修饰符修饰范围

16.使用JAR文件

上一篇 下一篇

猜你喜欢

热点阅读