内部类

一.内部类的定义:

如果在一个类中在定义一个类,则将在类中在定义的那个类称为内部类。

二.内部类的分类:

内部类可以分为成员内部类、局部内部类以及匿名内部类、静态内部类。

首先来说下成员内部类;

1.成员内部类:

*成员内部类的语法:

public class OuterClass{        //外部类
       private class InnerClass{//内部类
        //.......
    }
}

在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员变量被修饰为private。下面有实例代码:

public class outclass{
    private int i=0;    //修饰为private的成员变量
    private void goout(){    //修饰为private的成员方法
        System.out.println("方法执行成功");
    }
    class InnerClass{    //修饰为private的成员变量和方法可以在内部类中随意调用
        void test(){
               goout();
                i++;
        }
    }
}

内部类的实例一定要绑在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类上对象上。内部类初始化方法与其他类初始化方式相同,都是使用new关键字。 

public class OutClassTest {
InnerClassTest in =new InnerClassTest();
public void out(){
	in.intest();//在外部类方法中通过内部类对象调用内部类方法
}
class InnerClassTest{
	InnerClassTest(){//内部类的构造方法
	}
	public void intest(){}//内部类成员方法
	int i=0;		//定义内部类成员变量
}
public InnerClassTest get(){//外部类方法,返回值为内部类引用
	in.i=5;			//外部类不可以直接访问内部类的成员变量
	return new InnerClassTest();//返回内部类引用
}
public static void main(String []args){
	OutClassTest out = new OutClassTest();
	//内部类的实例化操作必须依靠外部类或者外部类的非静态方法中实现
	System.out.println(out.in);
	OutClassTest.InnerClassTest in=out.get();
	System.out.println(in);
	OutClassTest.InnerClassTest in1=out.new InnerClassTest();
	System.out.println(in1);
}
}

注意:内部类可以访问它的外部类成员,但内部类的成员只有在内部类的范围类是可见的,不能被外部类使用。例如对内部类的成员变量i进行第二次赋值时将会出错,但是可以使用内部类对象引用调用成员变量y。如 new InnerClass().y;

*内部类向上转型为接口

如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者转型为一个接口,在程序中就可以完全隐藏内部类的实现过程。可以外部提供一个接口,在接口中声明一个方法;如果在实现接口的内部类中实现接口的方法,就可以定义多个内部类以不同的方式实现接口的同一个方法。

下面有一个实例,可以同通过创建一个ClassTest测试类,并定义一个接口OutInterfaceTest,让内部类实现接口OutInterfaceTest,最后调用外部类OutClassTest1的doit()方法返回值类型为OutInterfaceTest接口;

public interface OutInterfaceTest {
public void go();
}

public class OutClassTest1 {
//定义一个外部类实现OutInterfaceTest接口
	private class Innerclass1 implements OutInterfaceTest{
		Innerclass1(String s){
			System.out.println(s);
		}

		@Override
		public void go() {
			System.out.println("访问内部类的go()方法");
		}
	}
	public OutInterfaceTest doit(){
		return new Innerclass1("访问内部类构造方法");
	}
}

public class ClassTest {
public static void main(String []args){
	OutClassTest1 out =new OutClassTest1();//实例化一个OutClassTest1对象
	OutInterfaceTest outinter=out.doit();//调用doit(),返回一个OutInterfaceTest接口
	outinter.go();		//调用内部类的f()方法
}
}

输出结果:

由于内部类Innerclass1访问权限为private,除了外部类可以访问外,其他类都不能访问,而可以访问doit()方法,返回一个外部接口类型 ,通过上述代码,将内部类向上转型为接口,创建一个外部类对象,从而访问到私有内部类的f()方法;

注意:非内部类不能被声明为private或protected类型。

*使用this获得内部类与外部类的引用

下面有一个实例,解释了如何在外部类中定义的成员变量与内部类的成员变量相同时,可以使用this关键字进行区分。

class DemoTest {
private int i;
public class test{
	private int i=12;
	public void add(int i){
		i++;//调用形参变量i
		this.i++;//调用内部类变量i
		DemoTest.this.i++;//调用外部类变量i
	}
}
}

在类中如果遇到内部类与外部类同名的成员变量,可以使用this关键字进行区分。

2.局部内部类

内部类不仅可以在类中进行定义,而且还可以定义在类的局部的位置,如在类的方法或者任意的作用域中均可以定义内部类。

下面是一个实例,将内部类定义在外部类的doit()方法的内部;

public interface OutInterfaceTest1 {//定义一个接口

}

public class Demotest1 {
public OutInterfaceTest1 doit(final String s1){
	//在doit方法内部定义一个内部类
	class test implements OutInterfaceTest1{
		test(String s2){
			s2=s1;
			System.out.println(s2);
		}
	}
	return new test("doit");
}
}

从上述实例可以看到内部类被定义到了doit()方法的内部,此时的内部类test是doit()方法体的一部分,并不是Demotest1 类的一部分,所以在doit()的外部不能访问该内部类,但内部类可以访问当前代码块的常量,以及外部类所有的成员。

3.匿名内部类

在doit()方法中将return语句和内部类定义语句合并在一起,下面通过一个实例说明。

在return语句中编写返回值为一个匿名内部类。下面是一个实例;

public interface OutInterfaceTest1 {//定义一个接口

}

public class DemoTest2 {
	public OutInterfaceTest1 doit(){//定义doit()方法
		return new OutInterfaceTest1(){//声明匿名内部类
			private int i=0;
			public int getI(){
				return i;
			}
		};
	}
    public static void main(String []args){
		DemoTest2 demo =new DemoTest2();
		System.out.println();
		OutInterfaceTest1 out=demo.doit();
		System.out.println(out.getClass().getName());
		//System.out.println(demo.doit().getClass().getName());
	}
}

上述所写的代码有点奇怪,是我以前没有接触到的,但是它确实能通过编译。首先是在doit()方法内部的一个引用,然后在retrun语句中插入一个定义内部类的代码,因为这个代码没有名称,所以就把该类称为内部类。实质上这种内部类的作用就是创建一个实现于OutInterfaceTest1接口的内部类的对象。

匿名内部类的实现语法如下:

return new A(){
    //内部类代码
};

A代表类名,由于匿名内部类使用构造方法来生成OutInterface对象。在匿名内部类结束后,需要加分号标识,这个分号并不代表定义内部类结束的标识,而是代表引用表达式结束的标识。

注意:匿名内部类编译以后,或产生以“以外部类名$序号”为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类。

例如匿名内部类的实例的输出结果就是以上述方式的结果;

输出结果:

4.静态内部类

定义:在一个内部类前添加修饰符static,这个内部类就变为静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。

静态内部类最大的特点是:不可以使用外部类的非静态成员,所以静态内部类在程序开发中比较少见。可以这么认为,普通内部类对象隐式的在外部保存了一个引用,指向了创建它的外部类对象。

静态内部类的两个特点:

如果创建静态内部类对象,不需要其外部类的对象。  

不能从静态内部类的对象访问非静态外部类的对象;

接下来,定义一个静态内部类,下面是示例代码;

public class DemoTest3 {
int x;
	static class Test{
		void get(){
			//System.out.println(x);  //注意这条输出语句是错误的,不可以在静态内部类中调用外部类的成员变量!!!!!!!
		}
	}
}

注意:上述代码中get()方法中的输出外部类成员变量x的语句是错误的,因为静态内部类中是不能调用外部类的成员变量。

进行程序测试时,如果在每一个java文件都写一个主方法会显示麻烦,因此,我们可以将主方法写入静态内部类中。

下面是一个实例,在静态内部类中定义主方法;

public class DemoTest4 {
	int x=50;
	static class Test{
		void get(){
			System.out.println("get()方法执行成功");
		}
		public static void main(String []args){
			System.out.println("静态类中的主方法");
		}
	}
}

代码编译完成后,会生成一个名称为“外部类名$Test”的独立类和一个StaticInnerTestClass类。

三、内部类的继承

内部类和其他类一样可以被继承,但是继承内部类比继承不同类要复杂一些,需要设置专门的语法来完成它;

下面有一个实例:

public class DemoTest extends Demo.Example{//继承内部类Example
    public DemoTest(Demo d){
        d.super();
    }
}
class Demo{
    class Example{
    }
}

在某各类继承内部类的时,必须硬性给与这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法体中使用d.super()语句,这样为继承提供了必要的对象引用;

参考:java从入门到精通书籍

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
健身国际俱乐部系统是一种专为健身俱乐部设计的管理软件,它通过集成多种功能来提高俱乐部的运营效率和服务质量。这类系统通常包含以下几个核心模块: 1. **会员管理**:系统能够记录会员的基本信息、会籍状态、健身历史和偏好,以及会员卡的使用情况。通过会员管理,俱乐部可以更好地了解会员需求,提供个性化服务,并提高会员满意度和忠诚度。 2. **课程预约**:会员可以通过系统预约健身课程,系统会提供课程时间、教练、地点等详细信息,并允许会员根据个人时间表进行预约。这有助于俱乐部合理安排课程,避免资源浪费。 3. **教练管理**:系统可以管理教练的个人信息、课程安排、会员反馈等,帮助俱乐部评估教练表现,优化教练团队。 4. **财务管理**:包括会员卡销售、课程费用、私教费用等财务活动的记录和管理,确保俱乐部的财务透明度和准确性。 5. **库存管理**:对于俱乐部内的商品销售,如健身装备、营养补充品等,系统能够进行库存管理,包括进货、销售、库存盘点等。 6. **数据分析**:系统能够收集和分析会员活动数据,为俱乐部提供业务洞察,帮助俱乐部制定更有效的营销策略和业务决策。 7. **在线互动**:一些系统还提供在线平台,让会员可以查看课程、预约私教、参与社区讨论等,增强会员之间的互动和俱乐部的社区感。 8. **移动应用**:随着移动设备的普及,一些健身俱乐部系统还提供移动应用,方便会员随时随地管理自己的健身计划。 9. **安全性**:系统会确保所有会员信息的安全,采取适当的数据加密和安全措施,保护会员隐私。 10. **可扩展性**:随着俱乐部业务的扩展,系统应该能够轻松添加新的功能和服务,以适应不断变化的市场需求。 健身国际俱乐部系统的选择和实施,需要考虑俱乐部的具体需求、预算和技术能力,以确保系统能够有效地支持俱乐部的运营和发展。通过这些系统的实施,健身俱乐部能够提供更加专业和高效的服务,吸引和保留更多的会员,从而在竞争激烈的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值