精华内容
下载资源
问答
  • 结论:两种物种软骨细胞中Ca2 +稳态与HTS和离子置换行为相似。 静止[Ca2 +] i差异可能与物种,成熟阶段或Fura-2本身有关,需要进一步研究。 这些发现有助于我们理解不同物种关节软骨
  • 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们存在才赋予java强大面向对象能力。他们两者之间对抽象概念支持有很大的相似,甚至可以互换,但是也有区别。一、抽象类我们都知道在面向...

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。

    一、抽象类

    我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。

    在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

    同时,抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式有派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。

    在使用抽象类时需要注意几点:

    1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

    2、抽象方法必须由子类来进行重写。

    3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

    4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

    5、子类中的抽象方法不能与父类的抽象方法同名。

    6、abstract不能与final并列修饰同一个类。

    7、abstract 不能与private、static、final或native并列修饰同一个方法。、

    实例:

    定义一个抽象动物类Animal,提供抽象方法叫cry(),猫、狗都是动物类的子类,由于cry()为抽象方法,所以Cat、Dog必须要实现cry()方法。如下:public abstract class Animal {

    public abstract void cry();

    }

    public class Cat extends Animal{

    @Override

    public void cry() {

    System.out.println("猫叫:喵喵...");

    }

    }

    public class Dog extends Animal{

    @Override

    public void cry() {

    System.out.println("狗叫:汪汪...");

    }

    }

    public class Test {

    public static void main(String[] args) {

    Animal a1 = new Cat();

    Animal a2 = new Dog();

    a1.cry();

    a2.cry();

    }

    }

    --------------------------------------------------------------------

    Output:

    猫叫:喵喵...

    狗叫:汪汪...

    创建抽象类和抽象方法非常有用,因为他们可以使类的抽象性明确起来,并告诉用户和编译器打算怎样使用他们.抽象类还是有用的重构器,因为它们使我们可以很容易地将公共方法沿着继承层次结构向上移动。(From:Think in java )

    二、接口

    接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类,从我们不能实例化一个接口就可以看出。如new Runnable();肯定是错误的,我们只能new它的实现类。

    接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字,他表示该类在遵循某个或某组特定的接口,同时也表示着“interface只是它的外貌,但是现在需要声明它是如何工作的”。

    接口是抽象类的延伸,java了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷,但是推荐继承和接口共同使用,因为这样既可以保证数据安全性又可以实现多重继承。

    在使用接口过程中需要注意如下几个问题:

    1、个Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!

    2、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

    3、接口中不存在实现的方法。

    4、实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

    5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。

    6、在实现多接口的时候一定要避免方法名的重复。

    三、抽象类与接口的区别

    尽管抽象类和接口之间存在较大的相同点,甚至有时候还可以互换,但这样并不能弥补他们之间的差异之处。下面将从语法层次和设计层次两个方面对抽象类和接口进行阐述。

    3.1语法层次

    在语法层次,java语言对于抽象类和接口分别给出了不同的定义。下面已Demo类来说明他们之间的不同之处。

    使用抽象类来实现:public abstract class Demo {

    abstract void method1();

    void method2(){

    //实现

    }

    }

    使用接口来实现interface Demo {

    void method1();

    void method2();

    }

    抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据(但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。

    对子类而言,它只能继承一个抽象类(这是java为了数据安全而考虑的),但是却可以实现多个接口。

    3.2设计层次

    上面只是从语法层次和编程角度来区分它们之间的关系,这些都是低层次的,要真正使用好抽象类和接口,我们就必须要从较高层次来区分了。只有从设计理念的角度才能看出它们的本质所在。一般来说他们存在如下三个不同点:

    1、 抽象层次不同。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

    2、 跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。

    3、 设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

    为了更好的阐述他们之间的区别,下面将使用一个例子来说明。

    我们有一个Door的抽象概念,它具备两个行为open()和close(),此时我们可以定义通过抽象类和接口来定义这个抽象概念:

    抽象类:abstract class Door{

    abstract void open();

    abstract void close();

    }

    接口interface Door{

    void open();

    void close();

    }

    至于其他的具体类可以通过使用extends使用抽象类方式定义Door或者Implements使用接口方式定义Door,这里发现两者并没有什么很大的差异。

    但是现在如果我们需要门具有报警的功能,那么该如何实现呢?

    解决方案一:给Door增加一个报警方法:clarm();abstract class Door{

    abstract void open();

    abstract void close();

    abstract void alarm();

    }

    或者interface Door{

    void open();

    void close();

    void alarm();

    }

    这种方法违反了面向对象设计中的一个核心原则 ISP (Interface Segregation Principle)—见批注,在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方 法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变而改变,反之依然。

    解决方案二

    既然open()、close()和alarm()属于两个不同的概念,那么我们依据ISP原则将它们分开定义在两个代表两个不同概念的抽象类里面,定义的方式有三种:

    1、两个都使用抽象类来定义。

    2、两个都使用接口来定义。

    3、一个使用抽象类定义,一个是用接口定义。

    由于java不支持多继承所以第一种是不可行的。后面两种都是可行的,但是选择何种就反映了你对问题域本质的理解。

    如果选择第二种都是接口来定义,那么就反映了两个问题:1、我们可能没有理解清楚问题域,AlarmDoor在概念本质上到底是门还报警器。2、如果我们对问题域的理解没有问题,比如我们在分析时确定了AlarmDoor在本质上概念是一致的,那么我们在设计时就没有正确的反映出我们的设计意图。因为你使用了两个接口来进行定义,他们概念的定义并不能够反映上述含义。

    第三种,如果我们对问题域的理解是这样的:AlarmDoor本质上Door,但同时它也拥有报警的行为功能,这个时候我们使用第三种方案恰好可以阐述我们的设计意图。AlarmDoor本质是们,所以对于这个概念我们使用抽象类来定义,同时AlarmDoor具备报警功能,说明它能够完成报警概念中定义的行为功能,所以alarm可以使用接口来进行定义。如下:abstract class Door{

    abstract void open();

    abstract void close();

    }

    interface Alarm{

    void alarm();

    }

    class AlarmDoor extends Door implements Alarm{

    void open(){}

    void close(){}

    void alarm(){}

    }

    这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。

    批注:ISP(Interface Segregation Principle):面向对象的一个核心原则。它表明使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

    四、总结

    1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

    2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

    3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

    抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。

    展开全文
  • 接口和内部类为我们提供了一种将接口与实现分离更加结构化方法抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们存在才赋予java强大面向对象能力。他们两者之间对抽象概念支持有很大...

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。

    一、抽象类

    我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。

    在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

    同时,抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式有派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。

    在使用抽象类时需要注意几点:

    抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

    抽象方法必须由子类来进行重写。

    只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

    抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

    子类中的抽象方法不能与父类的抽象方法同名。

    abstract不能与final并列修饰同一个类。

    abstract 不能与private、static、final或native并列修饰同一个方法。

    实例:

    定义一个抽象动物类Animal,提供抽象方法叫cry(),猫、狗都是动物类的子类,由于cry()为抽象方法,所以Cat、Dog必须要实现cry()方法。如下:

    public abstract class Animal {

    public abstract void cry();      }

    public class Cat extends Animal{

    @Override

    public void cry() {

    System.out.println("猫叫:喵喵...");        }

    }

    public class Dog extends Animal{

    @Override

    public void cry() {

    System.out.println("狗叫:汪汪...");

    }

    }

    public class Test {

    public static void main(String[] args) {          Animal a1 = new Cat();

    Animal a2 = new Dog();

    a1.cry();

    a2.cry();

    }

    }

    --------------------------------------------------------------------

    Output:

    猫叫:喵喵...

    狗叫:汪汪...

    创建抽象类和抽象方法非常有用,因为他们可以使类的抽象性明确起来,并告诉用户和编译器打算怎样使用他们,抽象类还是有用的重构器,因为它们使我们可以很容易地将公共方法沿着继承层次结构向上移动。(From: Think in java)

    二、接口

    接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类,从我们不能实例化一个接口就可以看出。如new Runnable();肯定是错误的,我们只能new它的实现类。

    接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用 implements关键字,他表示该类在遵循某个或某组特定的接口,同时也表示着“interface只是它的外貌,但是现在需要声明它是如何工作的”。

    接口是抽象类的延伸,java了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷,但是推荐继承和接口共同使用,因为这样既可以保证数据安全性又可以实现多重继承。

    在使用接口过程中需要注意如下几个问题:

    个Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!

    接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

    接口中不存在实现的方法。

    实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

    不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。

    在实现多接口的时候一定要避免方法名的重复。

    三、抽象类与接口的区别

    尽管抽象类和接口之间存在较大的相同点,甚至有时候还可以互换,但这样并不能弥补他们之间的差异之处。下面将从语法层次和设计层次两个方面对抽象类和接口进行阐述。

    3.1语法层次

    在语法层次,java语言对于抽象类和接口分别给出了不同的定义。下面已Demo类来说明他们之间的不同之处。

    使用抽象类来实现:

    public abstract class Demo {

    abstract void method1();      void method2(){

    //实现

    }

    }

    使用接口来实现

    interface Demo {

    void method1();      void method2();

    }

    抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据(但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。

    对子类而言,它只能继承一个抽象类(这是java为了数据安全而考虑的),但是却可以实现多个接口。

    3.2设计层次

    上面只是从语法层次和编程角度来区分它们之间的关系,这些都是低层次的,要真正使用好抽象类和接口,我们就必须要从较高层次来区分了。只有从设计理念的角度才能看出它们的本质所在。一般来说他们存在如下三个不同点:

    抽象层次不同。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

    跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is-a” 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。

    设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

    为了更好的阐述他们之间的区别,下面将使用一个例子来说明。该例子引自:http://blog.csdn.net/ttgjz/article/details/2960451

    我们有一个Door的抽象概念,它具备两个行为open()和close(),此时我们可以定义通过抽象类和接口来定义这个抽象概念:

    抽象类:

    abstract class Door{

    abstract void open();

    abstract void close();

    }

    接口

    interface Door{

    void open();    void close();

    }

    至于其他的具体类可以通过使用extends使用抽象类方式定义Door或者Implements使用接口方式定义Door,这里发现两者并没有什么很大的差异。

    但是现在如果我们需要门具有报警的功能,那么该如何实现呢?

    解决方案一:

    给Door增加一个报警方法:clarm();

    abstract class Door{

    abstract void open();

    abstract void close();

    abstract void alarm();

    }

    或者

    interface Door{

    void open();

    void close();

    void alarm();

    }

    这种方法违反了面向对象设计中的一个核心原则 ISP (Interface Segregation Principle)—见批注,在Door的定义中把Door概念本身固有的行为方法和另外一个概念”报警器”的行为方 法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为”报警器”这个概念的改变而改变,反之依然。

    解决方案二:

    既然open()、close()和alarm()属于两个不同的概念,那么我们依据ISP原则将它们分开定义在两个代表两个不同概念的抽象类里面,定义的方式有三种:

    两个都使用抽象类来定义。

    两个都使用接口来定义。

    一个使用抽象类定义,一个是用接口定义。

    由于java不支持多继承所以第一种是不可行的。后面两种都是可行的,但是选择何种就反映了你对问题域本质的理解。

    如果选择第二种都是接口来定义,那么就反映了两个问题:

    我们可能没有理解清楚问题域,AlarmDoor在概念本质上到底是门还报警器。

    如果我们对问题域的理解没有问题,比如我们在分析时确定了AlarmDoor在本质上概念是一致的,那么我们在设计时就没有正确的反映出我们的设计意图。因为你使用了两个接口来进行定义,他们概念的定义并不能够反映上述含义。

    第三种,如果我们对问题域的理解是这样的:AlarmDoor本质上Door,但同时它也拥有报警的行为功能,这个时候我们使用第三种方案恰好可以阐述我们的设计意图。AlarmDoor本质是们,所以对于这个概念我们使用抽象类来定义,同时AlarmDoor具备报警功能,说明它能够完成报警概念中定义的行为功能,所以alarm可以使用接口来进行定义。如下:

    abstract class Door{

    abstract void open();

    abstract void close();

    }

    interface Alarm{

    void alarm();

    }

    class AlarmDoor extends Door implements Alarm{

    void open(){}

    void close(){}

    void alarm(){}

    }

    这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实抽象类表示的是”is-a”关系,接口表示的是”like-a”关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。

    批注:

    ISP(Interface Segregation Principle):面向对象的一个核心原则。它表明使用多个专门的接口比使用单一的总接口要好。

    一个类对另外一个类的依赖性应当是建立在最小的接口上的。

    一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

    四、总结

    抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

    在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

    抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

    抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。

    来源:chenssy

    链接:http://www.cnblogs.com/chenssy/p/3376708.html

    展开全文
  • 这项初步研究探索了两种沙漠蜗牛生殖带(RFs)和体液(BFs)-鞘氨醇单胞菌和原形鞘氨醇对哺乳动物冷冻保存精子参数影响。 这些沙漠蜗牛仅一年中5%活跃。 精子发生发生在睾丸激素水平高生理生态阶段,精子...
  • 基于香农-维纳指数,西塔鲁姆河上游地区在干旱季节(1.68)多样性与雨季(1.80)的相似,这表明大型动物群落多样性在个季节中都具有中等程度多样性。 与主要大型动物类群存在和丰度密切相关理化参数是...
  • 通过使用模仿FSH(PMSG)和LH(hCG)作用的两种激素,超排卵被用于刺激小鼠中大量卵母细胞产生和释放。 由于超排卵会对卵母细胞和胚胎发育产生负面影响,因此本研究旨在比较两种2细胞胚胎收集替代方法,以减少...
  • 与高粱不同,小米种子具有较少抗营养因子,是动物饲料配方更好选择。 珍珠粟就是这种粟一个例子,既有牧草型又有谷类。 但是,存在将小米用于谷物和残渣用于饲料双重用途机会。 在这项研究中,个小米:...
  • 结果:我们在个真实DNA数据集,分别是11β-珠蛋白基因第一个外显子和31个哺乳动物线粒体基因组编码序列之间进行了相似性/相异性分析。 结论:我们结果与我们文献中现有分析相符。 我们还将我们方法...
  • 14.3.4 实现智能动物和捕食者    计算动物和捕食者新位置算法,在 C# 和 F# 中,看起来很相似,因为,...我们将在接下来的两小节中,来讨论这些算法,每一小节展示一语言。   在 F# 中移动动物

    14.3.4 实现智能动物和捕食者

     

        计算动物和捕食者的新位置的算法,在 C# 和 F# 中,看起来很相似,因为,我们可以使用相同的集合处理函数,来实现它们。在 F# 和其他标准的函数式语言中,这些都属于标准库,在 C# 3.0 中,可使用 LINQ。我们将在接下来的两小节中,来讨论这些算法,每一小节展示一种语言。

     

    在 F# 中移动动物

     

        让我们从一个函数开始,取一个动物和当前状态的位置作为参数值,返回这个动物的新位置。在这个仿真中,我们将有大约 100 个动物,必须计算所有动物的新位置。这意味着,它可能是不值得的,使这个函数在一个调用内,以并行方式运行其逻辑。相反,我们会在稍后并行化许多函数调用。找出在哪里拆分这个计算的,是并行化应用程序的重要组成部分。

        清单 14.25 实现了动物行为,在通过仿真世界中,生成 10 个随机地点,找出在哪儿最安全。这是通过看到这个位置的直接路径,计算附近的捕食者有多近实现的。

     

    Listing 14.25 Implementing the animal behavior (F#)

     

    let moveAnimal (state:Simulation) (animPos:Vector) =
      let nearestPredatorDistanceFrom(pos) =
        state.Predators
        |> Seq.map (distance pos) |> Seq.min

      let nearestPredatorDistanceOnPath(target) =
        getPathPoints(10, animPos, target)
        |> Seq.map nearestPredatorDistanceFrom |> Seq.min

      let target =
        randomLocations(10)
        |> Seq.maxBy nearestPredatorDistanceOnPath

      animPos + (target - animPos) *
        (20.0 / (distance target animPos))

     

        清单 14.25 首先实现两个本地的工具函数。第一个函数使用 Seq.map 来计算每个捕食者与指定的位置之间的距离,然后,使用 Seq.min 找出其中的最短距离。第二个函数在这个动物的当前的位置和指定的目标的路径是,查找最近的捕食者,通过检查它们之间路径上的几个点实现。

        接下来,我们选择动物的目标位置。我们生成 10 随机的位置,然后选择一个动物可以到达的位置,而呆得尽可能远离捕食者。用 Seq.maxBy 做,返回的元素给指定的函数,返回最大值。在我们的例子中,这个函数将返回最短的距离,在捕食者与从动物的当前位置到随机生成的目标路径之间。最后,我们使用 Vector 类型的重载运算符,计算并返回动物的新位置。每次函数调用,动物在生成的最佳方向上移动 20 点。

        我们将使用类似的算法来移动捕食者,但是,显然具有不同的目标。捕食者也将生成随机位置,然后,在最佳的方向上移动。下面一小节显示了代码的 C# 版本。

     

    在 C# 中移动捕食者

     

        确定捕食者的最佳目标的算法有点困难。我们要使捕食者沿着的路径直,有最多的动物和最少的其它捕食者。实现这个算法的 C# 方法展示在清单 14.26。这是Simulation 类的一部分,它可以很容易地访问其它捕食者和动物。(这就是不需要取当前状态作为参数的原因,像我们在 F# 动物行为的函数中所做的;当前状态用 this。)

     

    Listing 14.26 Implementing the predator behavior (C#)

     

    int CountCloseLocations(IEnumerable<Vector> an, Vector pos) {
      return an.Where(a =>
        Distance(a, pos) < 50).Count();
    }

    int CountCloseLocationsOnPath(IEnumerable<Vector> an,
        Vector pfrom, Vector ptarget) {
      return GetPathPoints(10, pfrom, ptarget)
        .Sum(pos => CountCloseLocations(an, pos));
    }

    Vector MovePredator(Vector predPos) {
      var target = RandomLocations(20).MaxBy(pos =>
        CountCloseLocationsOnPath(Animals, predPos, pos) -
        CountCloseLocationsOnPath(Predators, predPos, pos) * 3);

      return predPos + (target - predPos) *
        (10.0 / Distance(target, predPos));
    }

     

        在动物移动的 F# 代码中,我们首先实现两个本地辅助函数。在 C# 中,我们把类似的辅助函数实现为普通的方法。原则上,我们也可以使用本地 lambda 函数,但是,我们决定使用更典型的 C# 方法,以使代码更简单。

        第一个方法取一个向量的集合(可以是动物的集合,也可以是捕食者的集合),计臬出靠近指定点的有多少。第二个辅助函数计算出在整个路径上,有多少捕食者靠近选定点的和。这是通过在路径上生成一个点的集合实现,对每个点调用第一个方法,计算结果的和。如果在路径上有多个点靠近,可以一个捕食者多次。实际上,这并不是问题,因为,如果一个捕食者靠近多个点,它可能更危险。

        要实现捕食者的行为,我们生成 20 个随机位置,选择一个有最多的动物、最少捕食者的位置,靠近捕食者的当前位置和目标之间的路径。每个随机位置,我们两次调用 LocationsOnPath,计算这个"分值"。我们把捕食者邻近的数乘以一个常数,使它更明显,因为在整个仿真世界中的捕食者的数量太少。MaxBy 扩展方法返回有最大分值的位置。这个方法并不是一个标准的 LINQ 运算符,但是,你可以在本书的网站上,完整的仿真源代码中找到它的实现。

        现在,我们已经有了计算动物和捕食者的新位置的函数,终于可以实现仿真的更大一步的函数。需要计算所有动物和捕食者的新位置,所以,这将是在仿真中引入并行度的最佳地方。

    展开全文
  • 野生动物保护至关重要,特别是对于像肯尼亚这样的依赖旅游业... 基于沃伦(Warren)I指数(I = 0.78)的生态位相似性表明,两种斑马物种在其占据的生态位环境中都是相同的,这表明这两种斑马都可以采用相似的对话策略。
  • 香料( Perfume),又称香原料,是能被嗅觉嗅出气味或味觉品出香味有机物,是调制香精原料,可以是...其中按照后两种方法分类较为完全。按照来源,香料可以分为天然香料和人造香料两大类。精细化学品天然香料包括动物...

    香料( Perfume),又称香原料,是能被嗅觉嗅出气味或味觉品出香味的有机物,是调制香精的原料,可以是单体,也可以是化合物。

    香料的分类有多种不同的方法。如有的是根据香气的相似性分类的;有的是根据香料的用途分类的;有的是按照制造香料的原料来源进行分类的;还有的是采用有机化合物分类法进行分类的。其中按照后两种方法分类较为完全。按照来源,香料可以分为天然香料和人造香料两大类。

    d4356a589115501370a3ddf010d44266.png

    精细化学品

    天然香料包括动物性天然香料和植物性天然香料。动物性天然香料是来源于动物体内的有香物质;植物性天然香料是以植物的花、叶、茎、根或果实等为原料生产出来的多种成分化合物。

    人造香料分为单离香料和合成香料。单离香料是指通过物理的或化学的方法从天然香料

    中分离出来的单体香料化合物。单离香料是单个结构的化合物,可作为调和香料(香精)的重要原料及其他用途,如具有玫瑰香气的香叶醇、香茅醇是通过蒸馏法从香茅油中分离出来的单个结构且利用价值高的化合物。合成香料是指通过化学合成的方法制取的香料化合物。合成这类香料的原料有石油化学制品、煤焦油制品以及天然香料中分离出的单离香料。合成香料的数量最大,目前世界上合成香料已达5000多种,常用的产品有400多种。按照化学结构特征分类,合成香料可以分为烃类香料、醇类香料、酚类和醚类香料、醛类和缩醛类香料、酮类和缩酮类香料、羧酸类香料、酯类和内酯类香料、含氮或硫类香料、杂环类香料等。单离香料和合成香料都属于单体香料。

    7604247a9063392c81cf0c5cbc84ea7e.png

    香精

    2.香精的基本概念及分类

    香精( Perfume Compound),是由人工调配出来的或由发酵、酶解、热反应等方法制造

    的含有多种香成分的混合物,又称调和香料。调配香精的过程又称为调香。香精具有一定的

    香型,调和比例常用质量分数表示。单体香料和天然香料的香气香味比较单调,除极个别的

    种外,一般都不能单独使用,必须将其调配成香精后,才能用于加香产品中。

    香精的分类方法也很多,出发点不同可以有不同的分类方法。

    e871f1369b411516f2bf7cb95f7c6c01.png

    香精香料

    (1)根据香精的用途分类

    香精按用途可分为食用香精、日用香精和其他香精。食用香精可分为:食品香精、烟用香精、酒用香精、药用香精、饲料香精等;日用香精可分为化妆品和洗涤用品香精、香皂和洁齿用品香精、熏香和空气清新剂香精等;其他香精包括塑料、橡胶及人造革香精,纸张油墨及工艺品用香精,涂料、纺织品及引诱剂用香精。

    (2)根据香精的香型进行分类

    食用香精按香型分类,一般是与一种食品或天然存在的可食性生物的香型相联系,如水果、牛奶、酒、烟草、蘑菇、肉、玫瑰、洋葱、甘蓝、番茄等香型。有一种食品,就有一种对应的香型。食用香精按香型分类可以细化到每一种食品。

    日用香精按香型分类一般分为花香型香精和非花香型香精两类。花香型香精多是模仿天然花香调和而成,一般用于化妆品中。非花香型香精有的是模仿实物调配,有的则根据幻想而调配,这类香精往往有一个美妙抒情的称号,如力士、古龙、微风、素心兰、黑水仙、吉卜赛少女、圣诞节之夜等。幻想型香精多用于香水、化妆品中。

    8ff2d59b9dc6b1d3c5bcc6811861d394.png

    香水

    (3)根据香精的形态分类

    香精按形态分类可分为液体香精和固体香精。液体香精可分为水溶性香精、油溶性香精、乳化香精;固体香精可分为担体吸收型粉末香精、粉碎型粉末香精、喷雾干燥型粉末香精、冷冻干燥型粉末香精。水溶性香精广泛用于果汁、汽水、果冻、果子露、冰淇淋、烟草和酒类中,在香水、花露水、化妆水等化妆品中也不可缺少。以植物油为溶剂的油溶性香精多用于食品工业中,而以有机溶剂或香料之间的互溶而配成的油溶性香精,一般用在膏霜膏、唇膏、发脂、发油等化妆品中。乳化香精主要用于奶糖、巧克力、糕点、冰淇淋、奶制品等食品中。固体香精广泛用于香粉、香袋、固体饮料、奶粉、工艺品、毛纺品中。

    展开全文
  • 在大鼠中,阿卡波糖活性比在人体内强约十倍,并且在两种物种中新沙雷诺醇活性相似。 比较了阿卡波糖和新萨拉辛醇对人和大鼠中四个α-葡萄糖苷酶催化域结合亲和力,以研究物种间活性差异原因。 通过与四个...
  • 聚类聚类,简单来说,就是将一个庞杂数据集中具有相似特征数据自动归类到一起,称为一个簇,簇内对象越相似,聚类效果越好。它是一无监督学习(Unsupervised Learning)方法,不需要预先标注好训练集。聚类...
  • 机器学习---基础知识

    2014-08-11 17:17:37
    算法很多,从两个方面介绍:第一种划分算法是根据学习的方式;第二种是第一种划分算法的方式是根据学习的方式,第二种则是基于形式和功能的相似性(就像把相似的动物归为一类一样)。两种方式都是有用的。
  • 进行了一项研究,以比较两种低浓度(CSL),低(300 g /天)和高(450 g /天)浓缩物补充水平下埃塞俄比亚Rutana,... Rutana(54.7)EBW基础DP高于Washera绵羊(48.1),而两种基因型Gumuz(50.9)值均相似。 与
  • 由于这两种物质之间可能发生交叉反应,因此将蜂胶敏化特性与秘鲁香脂敏化特性进行了比较。 结果:蜂胶组豚鼠皮肤在第一次观察(48小时)和第二次观察(72小时)相比,对照组均无可见变化。 秘鲁香脂组豚鼠...
  • 在暴露45天中,两种类型箔均被生物膜均等地定殖,从纤毛和鞭毛开始,最后是硅藻和绿色丝状藻类。 由于季节性演替,在随后4个实验中某些分类单元绝对量有所不同。 在暴露180天中,箔片仅有少量重量损失...
  • 在这篇文章中, 我们将介绍最流行的机器学习算法.浏览该领域的主要算法以了解可用的方法有哪些是有用的....第二种是按照形式或功能上的相似性进行分组的算法(如将相似的动物分组在一起).这两种方法都是有...
  • 虫媒病毒性脑炎是一组动物和人类疾病,主要由几不同病毒家族引起,这些病毒家族包括正统病毒,phlebovirus,黄病毒和alphaviruss。 尽管特定体征和症状因中枢神经系统(CNS)类型而异,但初始体征和症状却...
  • 机器学习算法基础知识

    千次阅读 2015-06-24 16:49:46
    第一种划分算法的方式是根据学习的方式,第二种则是基于形式和功能的相似性(就像把相似的动物归为一类一样)。两种方式都是有用的。 学习方式 基于其与经验、环境,或者任何我们称之为输入数据的相
  • 机器学习算法一览图

    2017-02-21 15:50:00
    在这篇文章中,将介绍最流行的机器学习算法。  在场中浏览主要算法以获得可用的方法的感觉是有用的。... 第二种是通过形式或功能上的相似性(例如将类似的动物组合在一起)的算法分组。 这两种方法...
  • 一个单一基因型植物(受主)暴露于具有相似或不同基因型邻近发射器植物挥发性排放物中,并被完整或被一特殊草食动物的幼虫破坏了十天。 四处理中每一均在单独环境室内分离,整个实验重复次。 在...
  • 生物学家根据最长公共序列来确定 DNA 链的相似性,进而判断两种动物或疾病有多相似。最长公共序列还被用来寻找多发性硬化症治疗方案。 源代码管理中,git diff指令,可以查找出编辑前后文件差异,这是基于动态规划...
  • 而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来说,你并不清楚这个数据集内部有多少种类的动物,你能做的只是利用聚类方法将它自动按照特征分为多类,然后人为给出这个
  • 聚类,简单来说,就是将一个庞杂数据集中具有相似特征数据自动归类到一起,称为一个簇,簇内对象越相似,聚类效果越好。它是一无监督学习(Unsupervised Learning)方法,不需要预先标注好训练集。聚类与...
  • 聚类,简单来说,就是将一个庞杂数据集中具有相似特征数据自动归类到一起,称为一个簇,簇内对象越相似,聚类效果越好。它是一无监督学习(Unsupervised Learning)方法,不需要预先标注好训练集。聚类与...
  • k Means

    2019-12-22 16:27:34
    聚类,简单来说,就是将一个庞杂数据集中具有相似特征数据自动归类到一起,称为一个簇,簇内对象越相似,聚类效果越好。它是一无监督学习(Unsupervised Learning)方法,不需要预先标注好训练集。聚类与...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

两种相似的动物