学习记录-内部类

内部类

内部类

一个类中定义另一个类

外嵌类

包含内部类的类

内部类与外嵌类之间的关系

1)外嵌类的成员变量在内嵌类中仍然有效,内部类的方法可以调用外嵌类的方法
2)内部类不可声明类变量和类方法,外嵌类可用内部类声明对象作为自己成员
3) 内部类仅供它的外嵌类使用,其他类不可使用内部类声明对象

示列
package com.zpark.test;

public class RedCowForm {
    static  String forName;
    RedCow cow;//内部类声明对象
    RedCowForm(String s){
       cow= new RedCow(150,112,5000);
       forName=s;
    }


    public  void showMessage(){
        cow.speak();
    }

    class RedCow{
        //内部类声明
        String cowName="红牛";
        int height,weight,price;
        RedCow(int h,int w,int p){
            height=h;
            weight=w;
            price=p;
        }

        void speak(){
            System.out.println(cowName+"身高;"+height+";体重:"+weight+"生活在"+forName);
        }

    }


}

类里面包含一个类
并且还将这个声明的一个对象作为自己的属性

main方法

package com.zpark.test;

public class Example7_1 {
    public static void main(String[] args) {
        RedCowForm red = new RedCowForm("红牛农场");
        red.showMessage();
        red.cow.speak();
    }
}

注意一下这个调用方式

如果内部类被修饰为static ,那么其他的类可以使用它来创建对象,但static内部类不能操作外嵌类的实例成员变量
内部类的字节码名字格式:外嵌类名$内部类名
注:非内部类不可以是static

匿名类

1)和子类有关的匿名类
2)和接口有关的匿名类

和子类有关的匿名类

创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称作匿名类

使用子类(匿名类创建对象)

匿名类类体
}

匿名类的特点

1)匿名类可以继承或重写父类的方法
2)匿名类是内部类,因为使用匿名类的时候,不然使用直接使用匿名类创建对象
3) 匿名类可以访外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法
4)由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法

示例`

`void f(A a){

}

该方法的参数类型是A类,但用户希望传递的是A类的子类对象,但没有符合要求的子类提供,这是我们就可以考虑匿名类

创建一个抽象类

package com.zpark.test;

abstract class OutputAlphabet {
    public abstract void output();
}

抽象类的实现类

package com.zpark.test;

public class OutputEnglish extends OutputAlphabet{
    @Override
    public void output() {
        //输出英文字母的子类
        for(char c='a';c<='a';c++){
            System.out.println(c);
        }
    }
}

package com.zpark.test;

public class ShowBoard {

    void showMessage(OutputAlphabet show){
    //注意接受的参数的类型
        show.output();
    }
}

main


public class Example7_2 {
    public static void main(String[] args) {
        ShowBoard showBoard = new ShowBoard();
        showBoard.showMessage(new OutputEnglish());
        //向参数传递OutputAlphabet的子类
        //outputAlphabet的对象
        showBoard.showMessage(new OutputAlphabet() {
            @Override
            public void output() {
                for(char c='a';c<='w';c++){
                    System.out.println(c);
                }
            }
        });//调用该方法结束


    }
}


和接口有关的匿名类

java允许直接使用接口名和一个类体直接创建一个匿名对象,此类体是实现接口的类去掉类声明后的类体,称作内部类

new Comparable(){

//实现接口的匿名类类体
}

如果某个方法的参数是接口类型,那么可以使用接口接口名和类体组合创建一个匿名对象传递给该方法的参数,类体必须重写接口中的所有方法

示例

创建一个接口

package com.zpark.test;

public interface SpeakHello {
    void speak();
}

某个类的方法需要一个接口类型的对象

package com.zpark.test;

public class HelloMachine {
    public  void turnOn(SpeakHello speakHello){
        speakHello.speak();
    }

}

main

package com.zpark.test;

public class Example7_3 {
    public static void main(String[] args) {
        HelloMachine helloMachine = new HelloMachine();
        helloMachine.turnOn(new SpeakHello() {
            //和接口Speakhello有关的匿名类
            @Override
            public void speak() {
                System.out.println("hello,you are welcome");
            }
        });
    }
}

-------------------------------end------------------------------------------------------

实例变量与类变量的区别

1)类变量是属于类的,该类变量在内存中占有相同的一块内存,修改它的值也会影响其他对象的这个类变量的,也就是所有对象共享类变量;实例变量是属于对象的,一个使用new运算符创建不同的对象,分配给这些对象的实例变量是不同的,修改有一个对象的实例变量不会影响其他的对象的实例变量
2)new 出多个对象是,这些实例变量会被分配不同的内存空间,但类变量会在类初始化的时候就分配内存空间,而且只为类变量分配一次内存空间
3) 类变量可以通过类名和对象访问,实例变量要通过对象访问

实例方法与类方法的区别

1)实例方法需要对象来调用是,类方法可以使用对象或者类名来调用
2)类方法不可以操作实例变量,只能操作静态变量和静态方法
实例方法则没有限制

重写与重载

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

原文链接:https://thinkwon.blog.csdn.net/article/details/104390612

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 张正友标定法是一种相机标定方法,可以用于确定相机内部参数和部参数。该方法基于相机成像原理,通过拍摄不同角度的标定板图像,利用图像中的特征点计算相机的内部参数和部参数。该方法具有精度高、适用范围广等优点,被广泛应用于机器视觉、三维重建等领域。 该方法的具体步骤包括:选择标定板、拍摄标定板图像、提取图像特征点、计算相机内部参数和部参数。其中,选择标定板需要考虑标定板的大小、形状、特征点数量等因素;拍摄标定板图像需要保证标定板在不同角度下都能被完整拍摄到;提取图像特征点需要使用特征点检测算法,如SIFT、SURF等;计算相机内部参数和部参数需要使用张正友标定法的数学模型,通过最小化重投影误差来求解。 在实际应用中,张正友标定法需要注意以下几点:标定板需要保持平整,避免出现弯曲、扭曲等情况;标定板需要在不同角度下拍摄多张图像,以提高标定精度;标定板需要在光线充足、均匀的环境下进行拍摄,避免光线不足或过强导致标定精度下降。 总之,张正友标定法是一种重要的相机标定方法,掌握该方法对于机器视觉、三维重建等领域的研究具有重要意义。 ### 回答2: 张正友标定法是用于相机投影模型标定的一种方法,其原理是在一组已知物点与其图像坐标的情况下,通过求解相机内参矩阵和参矩阵,从而得出相机的几何参数,可用于后续的相机运动估计和三维重建。 首先,需要准备一组已知的物点和其对应的图像坐标。物点最好组成一个三维坐标系,如在测量机中通过三维测量得到。接下来,通过张正友标定法求解相机的内参矩阵。内参矩阵包括了相机的焦距、像素尺寸、主点位置等参数,这些参数决定了像素坐标与实际物理坐标之间的转换关系。通过一些数学推导,可以得到内参矩阵的表达式,并且可以通过已知的物点和相应的图像坐标求解出内参矩阵。 接下来,需要求解相机的参矩阵,即相机坐标系相对于物点坐标系的位姿关系。通过张正友标定法,可以得到物点在相机坐标系下的坐标,从而求解出相机的参矩阵。参矩阵包括了相机的旋转矩阵和平移向量,这些参数描述了相机在物点坐标系下的位姿。 最后,通过内参矩阵和参矩阵,可以将相机坐标系下的物点坐标转换成像素坐标,从而可用于后续的三维重建和相机运动估计。需要注意的是,在实际应用中,因为测量误差和噪声的存在,标定误差会影响到后续的应用效果,所以需要对标定结果进行一定的误差分析和修正。 总而言之,张正友标定法是一种基于已知物点和其图像坐标的相机标定方法,通过求解相机的内参矩阵和参矩阵,可得到相机的几何参数,进而实现三维重建和相机运动估计等应用,具有广泛的应用价值。 ### 回答3: 张正友标定法是一种常用的摄像机标定方法,它的主要思想是通过成像偏移量和焦距的测量来确定相机的内参矩阵和参矩阵,从而实现对摄像机的校准。张正友标定法的流程主要分为以下几个步骤。 第一步,数据采集。采集一组已知尺寸的平面图案,例如棋盘格,同时记录下相机对图案的姿态(位置和姿态),姿态可以通过用相机拍摄不同姿态下的图案来得到。 第二步,提取图案角点。使用角点检测算法,例如Harris角点检测、SIFT角点检测等,从图像中提取出每个格子的四个角点。 第三步,计算图像坐标。对于每个角点,根据相机的内参矩阵和参矩阵,可以计算出其在图像中的坐标。 第四步,标定相机内部参数。利用上一步得到的图像坐标和对应的实际坐标,使用最小二乘法等求解相机的内参矩阵。 第五步,标定相机部参数。同样利用上一步得到的图像坐标和对应的实际坐标,使用求解PnP问题的算法可以得到相机的参矩阵。 通过以上步骤,就可以获得相机的内参矩阵和参矩阵,从而实现对摄像机的标定。在实际应用中,可以将标定结果用于建立相机-世界坐标系之间的转换关系,进而实现摄像机与物体的三维空间定位和跟踪等应用。 总之,张正友标定法是一种基于对摄像机成像原理的理解和应用的标定方法,是计算机视觉和机器视觉领域中常用的技术之一,也是深度学习等领域的前置步骤。掌握该方法的原理和实现技巧,对于进一步深入了解计算机视觉和机器视觉技术体系,以及开展实际应用有着重要的意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值