这篇文章能让你快速提高对内部类的理解

内部类

什么是内部类?简单点就是面向对象程序设计的概念。面向对象程序设计中,是可以在一个类的内部定义另外一个类,这种类统称为嵌套类,它有两种类型,即静态嵌套类和非静态嵌套类。静态嵌套类使用的频率很少,基本用不到,最重要的还是非静态嵌套类,也被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。

如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。就是把类定义在类的内部的情况就可以形成内部类的形式。A类中又定义了B类,B类就是内部类。B类可以当做A类的一个成员看待。

内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类。

首先来说一下内部类的三种定义形式:
1、在一个类(外部类)中直接 定义的内部类;
2、在一个方法(外部类的方法)中 定义的内部类;
3、匿名内部类。

内部类的特点:
1、 内部类可以直接访问外部类中的成员,包括私有成员
2、 外部类要访问内部类的成员,必须要建立内部类的对象
3、 在成员位置的内部类是成员内部类
4、 在局部位置的内部类是局部内部类

成员内部类被private修饰

  • 成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
public class InnerClass2 {
    public static void main(String[] args) {
       //创建内部类对象,并执行show()
       
	/* -- Outer2.Inner2 oi = new Outer2().new Inner2();
	 * -- 报错,Inner2已经被private了
	 */

       //3,测试被private的内部类的资源能否执行!
       new Outer2().test();
    }
}

class Outer2{
    //2,如果想要访问private的内部类,可以访问外部类提供的对应方法
    public void test() {
       //访问内部类方法
      new Inner2().show();
    }    
    
    //位置在类里方法外--成员内部类
    //1,内部类可以被private修饰,但是外界无法直接创建对象了!
    private class Inner2{
       public void show() {
           System.out.println("Inner2.show()");
       }
    }
}

被static修饰的内称为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。

  • 它的创建是不需要依赖于外围类的。

  • 它不能使用任何外围类的非static成员变量和方法。

public class InnerClass3 {
    public static void main(String[] args) {
       // 创建内部类对象测试show()
    
	/* -- Outer3.Inner3 oi = new Outer3().new Inner3();
	 * -- 报错,原因是Inner3是静态的内部类
	 */
	   Outer3.Inner3 oi = new Outer3.Inner3();//Outer3.Inner3通过类名.调用类中的静态资源
       oi.show();    
       Outer3.Inner3.show2();//调用静态内部类里的静态方法
    }
}

class Outer3{    
    //1,内部类被static修饰--随着类的加载而加载,会造成内存资源浪费,并不常用!
    static class Inner3{ 
       public void show() {
           System.out.println("Inner3.show()");
       }
       static public void show2() {
           System.out.println("Inner3.show2()");
       }
    }
}

局部内部类:有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

匿名内部类属于局部内部类,并且是没有名字的内部类。

public class InnerClass5 {
    public static void main(String[] args) {
       new Hello() {// 匿名对象,本身接口不能new,这里new Hello()匿名对象,就相当于Hello接口的实现类
           // 匿名内部类
           @Override
           public void save() {
           System.out.println("save()..");
           } 
           @Override
           public void update() {
              System.out.println("update()..");
           }
       }.update();// 触发指定的方法
       new Hello2() {//抽象类的匿名内部类
           @Override
           public void show() {  }
       }.show();       
       new Animal() {//普通类的匿名内部类
           @Override
           public void eat() {   }
       };
    }
}

//创建匿名对象+匿名内部类测试
class Animal{
    public void eat() {}
}

abstract class Hello2 {
    abstract public void show();
    public void delete() {   }
}

// 定义接口
interface Hello {
    void save();
    void update();
}
观察上面的代码,我们看清几个地方:
	 -- 匿名内部类是没有访问修饰符的。
     -- new 匿名内部类,这个类首先是要存在的。如果我们将那个InnerClass接口注释掉,就会出现编译出错。
     -- 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。

总结:我们为什么要使用内部类呢?看过《Think in java》的应该都知道,其中有这样一句话:“Java在程序设计中使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。”甚至可以这样说,接口只是解决了部分问题,而内部类使得多重继承的方法方式使解决方案变得更加完整。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着智能交通的快速发展,驾驶行为识别成为了汽车自动驾驶领域中的一个重要研究方向。驾驶行为识别旨在通过车辆内部和环境传感器数据,准确地检测出驾驶员的行驶状态和行为,从而为车辆安全和自动驾驶提供基础支持。在这方面,Timesformer作为一种高效的视频表示学习模型,已经吸引了越来越多的关注和研究。 Timesformer是一种基于Transformer架构的视频表示学习模型,它可以按时间序列对视频片段进行建模,从而获得具有时空上下文信息的视频特征表示。与传统的卷积神经网络相比,Timesformer可以充分利用视频序列中不同时间点之间的相关性和依赖性,使得学习到的视频特征更加准确和有效。因此,基于Timesformer进行驾驶行为识别可以提高模型的识别精度和鲁棒性。 具体而言,基于Timesformer进行驾驶行为识别的步骤包括以下几个方面: 1. 数据采集和预处理:收集驾驶员在不同路况下的视频数据,并进行数据清洗、裁剪和标注等预处理工作。同时,还需要根据不同的识别任务对数据集进行划分和归一化处理。 2. Timesformer模型的搭建和训练:基于TensorFlow等深度学习框架,搭建包括Timesformer模型、分类器和损失函数在内的驾驶行为识别模型,并利用已标注的数据训练模型。在此过程中,需要对模型的超参数进行调整和优化,以及使用正则化和dropout等方法防止过拟合。 3. 模型测试和评估:基于测试数据集评估模型的性能和准确率。可以采用不同的评价指标,如准确率、召回率、F1-score等,对模型进行整体和细节性评估。同时,还可以利用混淆矩阵和ROC曲线等工具分析模型的优缺点和应用场景。 基于Timesformer进行驾驶行为识别的优点主要有以下几个方面: 1. 具有更好的时空上下文建模能力,可以准确捕捉帧间和序列间的依赖性和相关性。 2. 可以通过自监督学习等方法进行弱监督学习,降低数据标注的成本,并且可以利用更加广泛的视频数据源进行训练。 3. 可以与传统的CNN等神经网络结合使用,实现更加复杂和高效的驾驶行为识别。 总之,基于Timesformer进行驾驶行为识别是一种高效、可靠和精准的方法,可以为智能驾驶和汽车安全提供有力支持。在未来的研究中,可以进一步优化模型结构和训练策略,提高模型的泛化性和实用性。同时,还可以探索模型的可解释性和可视化性,以便更加深入地理解和应用驾驶行为识别技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值