Java编程思想——细话Java接口

接口为我们提供了一种将接口与实现分离的更加结构化的方法。在选择使用接口通常有俩个目的:

  • 一是,为了可以向上转型
  • 二是,避免被创建对象(实例),这一点和抽象类是一致的。

任何抽象性都是应真正的需求而产生的,所以在开发中不能一味地使用接口,而要根据设计的需求。

《Java编程思想》给出的建议是:优先选择类,如果接口的必需性变得非常明确,那么就进行重构

一、抽象类和抽象方法

抽象类提供一批通用接口,希望可以通过这些接口操纵一系列类

抽象方法——一种不完整的方法,只有声明而没有方法体,具体如下

abstract void f();//含有关键字abstract

抽象类——即含有一个或多个抽象方法,并用关键字abstract修饰的类

//创建抽象类
abstract Animal{ 
   public void eat(String time);//抽象方法
   public void sleep(){
      System.out.print("Sheep!");
   }
}

class Dog extends Animal{
   public void eat(String time){    
     System.out.print("Dog "+time+"eat meat!");
   }
}
class Sheep extends Animal{
   public void eat(String time){
    System.out.print("Sheep "+time+"eat grass");
   }
}
public class Test{
   public void turn(Animal a){
      a.eat("8:00");
      a.sleep();
   }
   public static void main(String[] args){
     Animal[] a={new Dog(),new  Sheep()};
     for(Animal sub:a){
       turn(sub);
     }
    }
}
out:
Dog 8:00 eat meat!
Sleep!
Sheep 8:00 eat grass!
Sleep!

需要注意一点的是,抽象类是不能进行实例化的,所以Java为了让用户可以很清晰的清楚这一点采用了”抽象方法的机制“,利用其不完整性和关键字abstract的使用来告知编译器自身的特殊性,防止误导使用者。

二、接口

       interface是一个极度抽象的类,接口里面的方法同样没有方法体,它的存在就是为了保持一部分其他类的一致性。创建一个接口需要用关键字interface代替class,关键字前可以添加限定修饰符,但是如同类一样,一个接口文件中只能有一个public修饰的接口,且接口名必须与文件名一致。接口同样可以包含域,但是这些域隐式的是static和final

接口的使用形式很像继承,但是与继承又有很大区别,继承要求每一子类只能继承一个父类,但是接口则可以通过implements关键字进行多个接口的实现(相当于创建了一个可以向上转型为多种基类的类型,很像多重继承),

需要注意的是在接口中所有的方法都应该被声明为public,因为Java编译器是不允许接口的访问权限被降低的。

接口的具体实例如下:

package com.interface;
//创建接口
public interface Animal{ 
   String time="8:00";//static&final
   public void eat(String time);
   public void sleep();
}
package com.animalclass;
import com.interface.Animal;//导入接口

class Dog implements Animal{
   public void eat(String time){    
     System.out.print("Dog "+time+"eat 
 meat!");
   }
   public void sleep(){
     System.out.print("Dog sleep!");
   }
}
class Sheep implements Animal{
   public void eat(String time){
    System.out.print("Sheep "+time+"eat 
 grass");
   }
   public void sleep(){
     System.out.print("Sheep sleep");
   }
}
public class Test{
   public void turn(Animal a){
      a.eat(Animal.time);//time默认为static,所以可以通过接口名直接调用
      a.sleep();
   }
 public static void main(String[] args){
     Animal[] a={new Dog(),new  Sheep()};
     for(Animal sub:a){
       turn(sub);
     }
    }
}
out:
Dog 8:00 eat meat!
Dog sleep!
Sheep 8:00 eat grass!
Sheep sleep!

三、接口中的域

  • 默认都是static和final类型的,且自动是public的;
  • 不能是变量,不能是“空final”,但可以是非常量表达式;
Random RAND=new Random(20);
int ONE=RAND.nextInt(10);
double TWO=RAND.nextDouble()*10;
//注:这些域并不属于这个接口的一部分,它们被存储在该接口的静态存储区域内,可通过接口名直接调用

  • 接口域在Java没有枚举enum时起到了补充的作用,但是现在很少在接口中创建域。

四、嵌套接口

即接口之间可以进行互相嵌套,这种嵌套主要分为俩种:

  • 类中嵌套接口
class A{
   public interface B{void show();}
   public interface C{void show();}
   public interface D{void show();}
   //嵌套的也可以是私有接口,但是此时的接口不能被外部类或者接口进行访问,只能是通过方法(类似于访问类中的私有成员变量需要get方法)
   private interface E{void show();}
}

  • 接口中嵌套接口
interface A{
   public interface B{void show();}
   public interface C{void show();}
   public interface D{void show();}
}

除了上述内容,书中还介绍了关于接口的完全解耦的问题和接口在设计模式中的应用(策略设计模式、工厂设计模式),关于这俩点感觉很抽象,所以会在后边重点学习和记录。


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值