作者小头像 Lv.1
24 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

IOT、编程语言
个人勋章
TA还没获得勋章~
成长雷达
0
9
0
15
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

IOT、编程语言

达成规则

发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6949 154 1
他的回复:
华为云ID: breakin123 第三周笔记+读书心得第五章 面向对象之函数式编程5.1 函数式编程背景:    在数学中,函数就是有输入量输出量的一套计算方案,即“拿什么东西,做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做。本质:    真正的目的——传递一段代码。解决方法:从JDK8之后可使用新增的lamda表达式,这种表达式只针对有一个抽象方法的接口实现,以简洁的表达式形式实现接口功能来作为方法参数5.2 函数式接口函数式接口定义:有且只有一个抽象方法的接口,接口上标注有@FunctionalInterface注解(这个注解显式的标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口是函数式接口)Lambda表达式基本语法格式:   (参数列表)-> {表达式主体}(1)参数列表:用来向表达式主体内部实现的接口方法传入参数。多个参数之间用逗号分隔,可以省略数据类型,只有一个参数时还可以省略小括号(2)->:Lambda表达式箭牌,用来指定参数数据指向,不能省略(3)表达式主体:本质就是接口中抽象方法的具体实现。如果只有只有一条语句,可以省略分号、省略大括号,在lambda表达式主体中只有一条return语句时,也可以省略return关键字lambda表达式代替匿名内部类的条件:   接口中仅有一个抽象方法,因为lambda表达式是基于函数式接口实现的。JDK8新增加的函数接口   -java.util.function包下包含了许多类,用来支持Java的函数式编程。5.3 方法引用当lambda表达式主体只有一条语句时,程序不仅可以可以省略包含主体的花括号,还可以通过英文双冒号“::”的语法格式来引用方法和构造器。作用:进一步简化lambda表达式,本质是对lambda表达式的主体部分已存在的方法进行直接引用。分类:(1)通过类名引用静态方法         例程如下://定义一个函数式接口@FunctionalInterfaceinterface Calcable {    int calc(int num);} //定义一个类,并在类中定义一个静态方法class Math {    //定义一个求绝对值的方法    public  static int abs(int num) {        if (num 0){            return -num;        }else {            return num;        }    }} //定义一个测试类public class Example1 {        //下面这个方法的作用:将num灌进Calcable接口的方法中    private static void printAbs(int num, Calcable calcable) {        System.out.println(calcable.calc(num));    }       public static void main(String[] args)    {        //1. 使用匿名内部类的方式        printAbs(-8, new Calcable() {            @Override            public int calc(int num) {                return Math.abs(num);            }        });                //2. 使用lambda表达式        printAbs(-8, (n) -> {return Math.abs(n);} );         //3. 简化上面的lambda表达式        printAbs(-8, (n) -> Math.abs(n) );        //4. 使用方法引用进一步简化上面的简化表达式        printAbs(-8, (n) -> Math::abs );}(2)通过对象名引用方法         定义:通过实例化对象的名称来对其方法进行的引用         引用方法跟上例程中类似,就是把“::”前的类名替换成对象名(3)通过构造器引用方法         定义:指对类自带的构造器的引用,例程如下//定义一个函数式接口@FunctionalInterfaceinterface PersonBuilder {    Person buildPerson(String name);} //定义一个Person类,并添加有参构造方法class Person {    private String name;        public Person(String name) {        this.name =name;    }     public String getName() {        return name;    }} //定义一个测试类public class Example2 {        //PersonBuilder接口的实现类此时应该是 return new Person(name);    private static void printName(String name, PersonBuilder builder) {        System.out.println(builder.buildPerson(name).getName());    }       public static void main(String[] args)    {                        //1. 使用lambda表达式        printName(“张三”, (name) -> {return new Person(name);} );          //2. 简化上面的lambda表达式        printAbs(“张三”, name -> new Person(name) );         //3. 使用构造器引用进一步简化上面的简化表达式        printAbs(“张三”, Person::new);}     
发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6949 154 1
他的回复:
华为云ID: breakin123 第三周笔记+读书心得第五章 函数式编程1.1 函数式编程1. 背景:    在数学中,函数就是有输入量输出量的一套计算方案,即“拿什么东西,做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做。2. 本质:    真正的目的——传递一段代码。3. 解决方法:从JDK8之后可使用新增的lamda表达式,这种表达式只针对有一个抽象方法的接口实现,以简洁的表达式形式实现接口功能来作为方法参数1.2 函数式接口1. 函数式接口定义:有且只有一个抽象方法的接口,接口上标注有@FunctionalInterface注解(这个注解显式的标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口是函数式接口)2. Lambda表达式基本语法格式:   (参数列表)-> {表达式主体}(1)参数列表:用来向表达式主体内部实现的接口方法传入参数。多个参数之间用逗号分隔,可以省略数据类型,只有一个参数时还可以省略小括号(2)->:Lambda表达式箭牌,用来指定参数数据指向,不能省略(3)表达式主体:本质就是接口中抽象方法的具体实现。如果只有只有一条语句,可以省略分号、省略大括号,在lambda表达式主体中只有一条return语句时,也可以省略return关键字3. lambda表达式代替匿名内部类的条件:   接口中仅有一个抽象方法,因为lambda表达式是基于函数式接口实现的。4. JDK8新增加的函数接口   -java.util.function包下包含了许多类,用来支持Java的函数式编程。1.3 方法引用1. 当lambda表达式主体只有一条语句时,程序不仅可以可以省略包含主体的花括号,还可以通过英文双冒号“::”的语法格式来引用方法和构造器。2. 作用:进一步简化lambda表达式,本质是对lambda表达式的主体部分已存在的方法进行直接引用。3. 分类:(1)通过类名引用静态方法         例程如下://定义一个函数式接口 @FunctionalInterface interface Calcable { int calc(int num); } //定义一个类,并在类中定义一个静态方法 class Math { //定义一个求绝对值的方法 public static int abs(int num) { if (num 0){ return -num; }else { return num; } } } //定义一个测试类 public class Example1 { //下面这个方法的作用:将num灌进Calcable接口的方法中 private static void printAbs(int num, Calcable calcable) { System.out.println(calcable.calc(num)); } public static void main(String[] args) { //1. 使用匿名内部类的方式 printAbs(-8, new Calcable() { @Override public int calc(int num) { return Math.abs(num); } }); //2. 使用lambda表达式 printAbs(-8, (n) -> {return Math.abs(n);} ); //3. 简化上面的lambda表达式 printAbs(-8, (n) -> Math.abs(n) ); //4. 使用方法引用进一步简化上面的简化表达式 printAbs(-8, (n) -> Math::abs ); }(2)通过对象名引用方法         定义:通过实例化对象的名称来对其方法进行的引用         引用方法跟上例程中类似,就是把“::”前的类名替换成对象名(3)通过构造器引用方法         定义:指对类自带的构造器的引用,例程如下//定义一个函数式接口 @FunctionalInterface interface PersonBuilder { Person buildPerson(String name); } //定义一个Person类,并添加有参构造方法 class Person { private String name; public Person(String name) { this.name =name; } public String getName() { return name; } } //定义一个测试类 public class Example2 { //PersonBuilder接口的实现类此时应该是 return new Person(name); private static void printName(String name, PersonBuilder builder) { System.out.println(builder.buildPerson(name).getName()); } public static void main(String[] args) { //1. 使用lambda表达式 printName(“张三”, (name) -> {return new Person(name);} ); //2. 简化上面的lambda表达式 printAbs(“张三”, name -> new Person(name) ); //3. 使用构造器引用进一步简化上面的简化表达式 printAbs(“张三”, Person::new); }(4)类名引用普通方法        定义:指通过一个普通类的类名来对其普通方法进行引用。第六章  枚举和包装类及设计模式1. 枚举类型1.1 枚举类的定义1. 枚举是一种特殊类,枚举是由固定实例个数的类型,可以把枚举理解成有固定的个数实例的多例模式2. 定义枚举类型就是在定义一个类,只不过很多细节编译器进行了补齐,所以某种程度上,enum关键词的作用就像是class或者interface3. 当使用enum定义枚举类型时,实际上所定义出来的类型时继承自java.lang.Enum类,而每个被枚举的成员其实就是定义的枚举类型的一个实例,他们都被默认为final,无法改变常数名称所设定的值,他们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用他们。4. 枚举中的实例全部大写,且必须放在枚举类的最前面1.2 枚举类的结构1. 枚举也可以添加属性和方法,静态非静态皆可。2. 枚举中的实例跟跟常量是一个用法,不能对枚举类进行new创建对象3. 创建枚举类型对象时,用    枚举类型名 变量名 = 枚举类型名.实例名;4. 枚举内的构造器默认只能是private(否则在枚举外面就能new无数实例了,违背枚举类型定义),从而保证构造函数只能在内部使用5. 带抽象方法的枚举:    创建枚举的实例的时候,必须实现枚举类中的抽象方法1.3 枚举的应用1. 枚举类的常用API方法名解释values()取得所有枚举成员的实例,并以数组方式返回compareTo()比较两个枚举对象在枚举时的顺序(前一个枚举对象的索引位置减去后一个枚举对象的索引位置)ordinal()依枚举顺序得到位置索引,默认以0开始name()返回此枚举常量的名称2. 包装类2.1 包装类的定义1. JDK中提供了一系列包装类,通过这些包装类可以将基本数据类型的值,通过这些包装类可以将基本数据类型的值包装为引用数据类型的对象2. 包装类的继承关系:包装类对照表(注意红框中的两个比较特殊):2.2 自动装箱和拆箱1. 自动装箱:是指将基本数据类型的变量赋给对应对应的包装类变量(基本数据类型—>引用类型)int i = 10; Integer integer = i;   自动拆箱:指将包装类对象类型直接只给一个对应的基本数据类型变量(引用类型—>基本数据类型)Integer a = 5; int i = a;2. 包装类的API(1)通过String类的valueOf()方法,可将8种基本数据类型转换为对应的字符串类型(2)通过8种包装类的静态方法valueOf(),既可以将对应的基本数据类型转换为包装类,例如int b = 111; Interger a = Integer.valueOf(b);也可以将变量内容匹配的字符串(字符串必须是可解析为相应几倍类型的数据,如Integer.valueOf("111")是可以的,但是Integer.valueOf("111中文")这样就不行)转换为对应的包装类(除了Character包装类)(3)通过8种包装类的有参构造方法可以完成与(2)相同的功能,例Integer i = new Integer(666); Integer i = new Integer("666");(4)通过8种包装类的静态方法parseXxx(),可以将变量内容匹配的字符串转换为对应的基本数据类型int i = Integer.parseInt("666");3. 设计模式概念:设计模式代表了最佳实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
发布时间 2021/07/06 15:56:17 最后回复 hduzx 2021/08/17 12:42:40 版块 社区活动
5798 93 0
发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6949 154 1
他的回复:
华为云ID: breakin123   第二周笔记(第三、四章)+体会(7.12~7.18)第三章 面向对象之多态1. 方法重写1.1 子类和父类同名方法1. 方法重写(1)定义:子类和父类方法同名,称之为方法重写(2)前提:需要有继承关系(3)方法重写的四种表现:方法名必须相同参数列表必须完全相同返回值类型必须相同修饰符:范围可以扩大或相同,但是不能缩小(范围:public>protected>default,这里不涉及private)(4)注意:如果父类的方法是private,子类如果定义相同的方法只是定义了一个新方法,不属于方法重写2. 运行时多态(这部分注意与第一章方法重载部分关于早期绑定和编译时多态进行联动区分)(1)后期绑定:       如果被调用的方法在编译期无法被确定下来,只能够在程序运行期根据实际对象的类型绑定相关的方法,这种绑定方式被称为后期绑定(2)运行时多态(同一个方法名,不同的运行结果):       方法重写是根据实际创建的类型决定调用哪个重写方法,发生在运行期间(因为new对象发生在运行期间),所以方法重写也叫作运行时多态public class Animal { public void eat() { System.out.println("动物在吃东西"); } } public class Cat extends Animal { public void eat() { System.out.println("猫喜欢吃鱼"); } } public class Dog extends Animal { public void eat() { System.out.println("狗喜欢吃骨头"); } } public class Test { public static void main(String[] args) { Animal ani1 = new Cat(); Animal ani2 = new Dog(); ani1.eat(); //执行的是Cat类中的eat方法 ani2.eat(); //执行的是Dog类中的eat方法 } }1.2 static修饰同名方法1. 子类和static修饰的同名方法static修饰的方法是静态方法,也叫作类方法使用private,static或final修饰的变量或方法,属于早期绑定,所以向上转型的父类对象,在调用子类中也有同名的static修饰的方法时,实际调用的是父类中的方法,例如下:public class Animal { public static void eat() { System.out.println(“动物在吃”); } } public class Cat extends Animal { public static void eat() { System.out.println(“猫吃鱼”); } } public class Test { public static void main(String[] args) { Animal an = new Cat(); an.eat(); //an对象在调用方法时,调用的是Animal类里的方法 } }1.3 子类中的同名变量子类中若有跟父类同名的变量,子类不会继承父类的这个同名变量,各是各的。1.4 方法重载和方法重写的区别对比两者都是多态的具体表现名称方法重载(早期绑定)方法重写(后期绑定)类表现在同一个类当中表现在继承关系中方法名相同相同方法参数参数个数、顺序、类型不同参数列表相同返回值类型可以不同必须相同调用方式参数决定创建的实际对象类型决定具体调用哪个重写的方法static修饰方法名时仍是方法重载不再是方法重写,因为有static修饰就成了早期绑定2. 抽象类2.1 抽象类的定义1. 定义:    使用abstract修饰的方法叫抽象方法,抽象方法没有方法体。当一个类中包含了抽象方法,那么该类也必须使用abstract关键字来修饰,这种使用abstract关键字修饰的类就是抽象类2. 语法格式:    修饰符 abstract class 类名{        //定义抽象方法        修饰符 abstract 方法返回值类型 方法名(参数列表);       //其他方法或属性    }说明:(1)抽象方法的修饰符只能是public和protected,修饰后不能出现final,因为抽象方法本就是用来被重写的,final方法不能被重写(2)修饰符后面也不能出现static3. 抽象类不能被实例化,即不能new一个抽象类,但是可以利用对象向上转型,在定义抽象类对象时,让其上转型指向子类4. 抽象类可以拥有构造方法,但是不能通过“new+构造”的方式创建对象5. 子类的构造方法会默认调用父类的无参构造2.2 抽象类的作用1. 抽象类的作用类似于“模板”,其目的是方便开发人员根据抽象类的格式来修改和创建新类2. 抽象类主要用于继承,有利于程序的扩展3. 抽象类中可以没有抽象方法,但是有抽象方法的类必须是抽象类4. 子类继承抽象类时,必须实现父类中所有抽象方法3. 接口3.1 接口的定义1. 接口就是某事物对外提供的一些功能的声明2. 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱电3. 使用interface关键字定义接口3.2 接口的特点和作用1. 接口在JDK 8之前和之后有很大的区别,JDK 8之后接口的语法如下([ ]中内容表示如果不写系统会进行默认)    修饰符  interface  接口名 extends 父接口1,父接口2,...{        [public static final] 常量类型 常量名 = 常量值;                [public abstract] 方法返回值类型 方法名(参数列表);                [public] default 方法返回值类型 方法名(参数列表){        //默认方法的方法体        }        [public] static 方法返回值类型 方法名(参数列表){        //静态方法的方法体        }    }    JDK 1.8之后才有的带方法体的方法,一个接口内可以有多个静态方法,直接通过“接口名.方法名”的方式即可调用   总结:(1)在接口内部可以定义多个常量和抽象方法:定义常量时,必须进行初始化赋值;定义默认方法和静态方法时,可以有方法体(2)在接口中定义常量时,可以省略“public static final”修饰符,接口会默认为常量添加。与此类似,在接口中定义抽象方法时,也可以省略“public abstract”修饰符;定义默认方法和静态方法时,可以省略“public”修饰符,这些修饰符系统都会默认进行添加2. 接口的作用:接口表示一种能力,体现在接口的方法上4. 接口与抽象类对比1. 抽象类is-a符合“is a”关系的设计使用继承。继承是代码重用的一种方式,将子类共有的属性和行为放到父类中,子类与父类是is a关系(子类 is a 父类)2. 接口has-a接口更强调功能,突出的是has-a关系3. 举例防盗门 is-a 门,所以门是父类,父类门具有打开/关上两种行为防盗门 has-a 上锁/开锁两种功能 第四章 包和内部类1. 包机制1.1 包的定义和导入1. 定义:包跟系统中的文件夹是同一概念,不同的包可以存放同名的类而不冲突,包对应Java源文件的目录接口2. 包的命名:(1)由小写字母组成,不能以圆点开头和结尾;(2)包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名,例:         package  com.huawei.example;3. 包的作用:(1)允许类组成较小的单元(类似Windows系统中的文件夹),易于找到和使用相应的文件;(2)防止命名冲突;(3)有助于实施访问权限控制;4. import导包:    为了使用不在同一包中的类,需要在Java中使用import关键字导入这个类    格式:  import  包名.类名;5. 注意事项:(1)package必须位于有效代码的第一行,且只能有一个package语句(2)其次是import(3)后面才是各种类的声明1.2 Java常用包1.3 创建jar包和引用用eclipse工具可以把package包Export成一个jar包,对于可执行jar包,cmd命令行直接执行这个jar包即可运行1.4* 访问权限控制1. 针对类、属性和成员方法提供了四种访问级别,分别是private、default、protected和public(1)private(当前类访问级别):对于私有成员变量和方法,只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。(2)default(包访问级别):类的成员变量和方法,什么修饰符都没有,又叫包修饰符,只有类本身成员和当前包下类的成员可以访问。(3)protected(子类访问级别):用protected修饰的成员变量和方法能被该类的成员以及其子类成员访问,还可以被同一个包中其他类的成员访问。(4)public(公共访问级别):最宽松的访问控制级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类和类的成员能被所有类访问,不管访问类与被访问类是否在同一个包中。注:经试验,与父类不在同一个包下的子类,不能通过在子类中创建父类对象的方式去访问父类中的protected属性和方法,只能通过创建子类对象访问父类中的protected属性和方法,但是public没有这个限制。2. 内部类内部类的定义:在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称为外部类内部类分为:(1)成员内部类;(2)局部内部类;(3)静态内部类;(4)匿名内部类2.1成员内部类(即普通内部类)1. 定义:在一个类中,除了能定义成员变量和成员方法外,还可以定义类,这样的类被称作成员内部类2. 说明:在成员内部类中,可以访问外部类的所有成员(包括成员变量和成员方法),在外部类中,同样可以访问成员内部类的变量和方法3. 创建成员内部类对象的语法格式:    外部类名.内部类名  变量名 = new 外部类名().new 内部类名();    注意:如果只是外部类的普通方法中创建内部类对象,直接用内部类名  变量名 = new 内部类名();即可2.2 局部内部类(方法内部类)1. 定义:定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。2. 说明:在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。2.3 静态内部类1. 定义:使用static关键字修饰的成员内部类2. 说明:静态内部类在成员内部类前增加了static关键字,在功能上,静态内部类只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类,从而直接通过内部类访问静态内部类成员。3. 语法格式:创建静态内部类对象    外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();2.4 匿名内部类1. 定义:没有名称的内部类2. 说明:在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。    注:接口名  变量a = new 接口实现类();   若变量a是某个方法的参数时,可用创建匿名内部类对象的方式,省去再单独开一个接口实现类3. 语法格式:创建匿名内部类对象的具体语法格式如下:    new 父接口() {    //匿名内部类实现部分    。。。    }   注意:从JDK8开始,允许在局部内部类,匿名内部类中访问非final修饰的局部变量public interface MyInterface { public void show(); } public class MyInterfaceImpl implements MyInterface { @Override public show() { System.out.println("MyInterfaceImpl实现了MyInterface接口!"); } } public class Outer { public void test(MyInterface myInterface) { System.out.println("Outer类的test方法:"); myInterface.show(); } } public static void main(String[] args) { Outer outer = new Outer(); //方式一:通过创建接口实现类对象的方式调用包含有接口类型参数的方法 MyInterface mi = new MyInterfaceImpl(); //创建接口实现类对象 outer.test(mi); //把接口实现类对象作为参数传递给test方法 //方式二:使用匿名内部类的方式简化以上操作 outer.test(new MyInterface() { @Override //直接在匿名内部类中实现接口方法 public void show() {} System.out.println("通过匿名内部类实现了MyInterface接口!"); } }); }