5. 面对对象(基础) Part 3 --- 学习笔记

5.14内部类
       在类内部可定义成员变量与方法,而且在类内部也可以定义另一个类。如果在类Outer的内部再定义一个类Inner,此时类Inner就称为内部类,而类Outer则称为外部类
       内部类可声明称publicprivate。当内部类声明称publicprivate时,对其访问的限制与成员变量和成员方法完全相同。

1. 内部类的声明格式:
标识符 class 外部类的名称{

       //外部类的成员

     标识符 class内部类的名称{

             //内部类的成员

      }

}

范例 1:

class Outer {

      private String info = “Hello World!!!”;

      class Inner{

             public void print(){

                    System.out.println(info);

             }

      }

      public void fun(){

             new Inner().print();         

      }

}

public classInnerClassDemo01{

      public static void main(String args[]){

             new Outer().fun();              

      }

}
但是,内部类的存在实际上已经破坏了一个类的基本结构。因为类是由属性及方法组成的,所以这也是内部类的一个缺点。
内部类的优点在于: 把内部类拿到外面来定义。 代码如下:
class Outer{
     private String info = "hello world!!!";
     public String getInfo(){
          return this.info;
     }
     public void fun(){
          new Inner(this).print();
     }

}

class Inner{
     private Outer out = null;
     public Inner(Outer out){
          this.out = out;
     }
     public void print(){
          System.out.println(out.getInfo());
     }
}

public class InnerClassDemo02{
     public static void main(String args[]){
          new Outer().fun();
     }
}
内部类唯一的好处就是可以方便地访问外部类中的私有属性

2.  使用static定义内部类
     用static声明的内部类变成了外部类,但是用static声明的内部类不能访问非static的外部类属性

3.  在外部访问内部类
     一个内部类除了可以通过外部类访问,也可以直接在其他类中进行调用。
     调用的基本格式为
     外部类.内部类    内部类对象 =  外部类实例.new  内部类();
     *******首先要实例化外部类的对象,然后才可以通过外部类的实例化对象去实例化内部类的对象*******
     *****内部类定义之后,生成的class文件是以Outer$Inner.class的形式存在的。在java中只要在文件中存在$,那么在程序中都应替代为“.”。*****
class Outer{
     private String info = "Hello World!!!";
     class Inner{
          public void print(){
               System.out.println(info);
          }
     }
}

public class InnerClassDemo02{
     public static void main(String args[]){
          Outer out = new Outer();
          //Outer.Inner in = new out.Inner();    Wrong!!!!!!!!!!!!
          Outer.Inner in = out.new Inner();
          in.print();
     }
}

4. 在方法中定义内部类
      可以在方法中定义一个内部类,但是在方法中定义的内部类不能直接访问方法中的参数
      如果方法中的参数要想被内部类访问,则参数前必须加上final关键字
   实例:
class Outer{
     private String info = "Hello World!!!";
     public void fun(final int temp){
          class Inner{
               public void print(){
                    System.out.println("the attribute in class: " + info);
                    System.out.println("the argument in method: " + temp);
               }
          }
          new Inner().print();
     }
}

public class InnerClassDemo03{
     public static void main(String args[]){
          new Outer().fun(30);
     }
}

5.14  实例讲解

1. 系统登陆实例
     Problem: 模拟一个简单的用户登录程序,此处使用初始化参数的方式输入用户名和密码。
     Analyse:  既然使用了初始化参数的方法输入用户名和密码,那么在程序运行之前首先必须判断输入的参数是否合法,如果不合法,则必须提示用户的程序执行错误,并直接退出程序
     如果用户正确地输入了参数,则可以进行用户名及密码的验证,如果信息正确则正确显示“欢迎XXX光临”,否则显示“错误的用户名或者密码”。
实现一:   基本功能实现
class LoginTest(){
     public static void main(String args[]){
          if (args.length != 2){
               System.out.println("form Wrong, please type like this: Java LoginTest user_name user_password");
               System.exit(1);
          }
          String name = args[0];
          String password = args[1];

          if (name.equals("csdn") && password.equals("123qwe456")){
               System.out.println("Welcome back, " + name);
          }else{
               System.out.println("Wrong user name or password, please try again!");
          }
     }
}

实现二:   分离各种信息判断

class Check{
     public boolean validate(String name, String password){
          if (name.equals("csdn") && password.equals("123qwe456")) {
                    return true;
          }else {
                    return false;

     }
}
class Operate{
     private String info[];
     public Operate(String info[]){
          this.info = info;
    
}
     
     public String login(){
          this.ifLegal();
          String str = null;
          Check check = new Check();
          String name = this.info[0];
          String password = this.info[1];

          if (check.validate(name, password) {
               str = "Welcome back," + name;
          }else {
               str = "the name or password was wrong, please try again!";
          }
          
          return str;
}

     public void ifLegal(){
          if (this.info.length != 2){
               System.out.println("The form that you type was incorrect, please type like this: Java LoginTest user_name user_password");
               System.exit(1);
     }
}

public class LoginTest(){
     public static void main(String args[]){
          Operate ope = new Operate(args);
          System.out.println(ope.login());
     }
}

上面第二种实现方式的优点在于:
     1. 主方法处代码较少,因为是客户端,所以应该要方便客户使用。(胖服务器/瘦客户机)
     2. Check类的主要功能就是验证操作,只需要传入用户名和密码即可完成验证。
     3. Operate类的主要功能就是封装Check类的操作,并把Check的信息返回给调用处。

以上程序的调用关系如下图所示
                                       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值