java之--内部类总结

一. 内部类 (成员内部类,局部内部类,静态内部类,匿名内部类)

    1. 内部类含义:
            在类的内部也可以定义另一个类。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。   当内部类声明成public或private等时,对其访问的限制与成员变量和成员方法完全相同。 内部类的定义格式    标识符 class 外部类的名称{ //外部类的成员        标识符 class 内部类的名称{              //内部类的成员         } }

   // 2.  内部类可分为:   成员内部类,局部内部类,静态内部类,匿名内部类
   
    3. 内部类跟普通类是一样的,普通的类能干什么,内部也可以干什么,比如:继承 ,实现接口 ,可以帮助外部类实现多继承的功能,



二. 成员内部类
       (1)
       01. 成员内部类中,不能定义静态的属性     例如: public static int innerStaticField = 1; 
       02.可以访问外部类的的私有属性
       03.可以访问外部类的静态属性
       04.  内部类访问外部类属性的方法  Outer.this.属性    例如:S ystem.out.println("a:" + MemberOuter.this.a);  //内部类访问外部类属性方法;
       05.

     (2)成员内部类的运用场景 
        1. 通过内部类可以实现类的多继承
        2. 如果外部类,是一个逻辑非常复杂的一个,需要操作好多属性或方法,这个时候,可以将功能进行才分让某个或者多个内部类,帮忙处理
         案例

              package com.qianfeng.demo3;
  //外部类Circle

public class  Circle {
    private int radius;

    //把画圆的动作单独抽成一个内部类,它值负责画圆这个动作
    class  Draw{
        private int radius;
        public Draw(int radius){
            this.radius = radius;
        }

        public void draw(){
            System.out.println("真实画圆的逻辑....");
            System.out.println("内部类的画圆..." + radius);
        }
    }

    //准备画圆所需的环境,获取其他可变的参数
    //在设置后对象的参数,调用内部类对象进行有差别的画圆(可变参数决定)
    public void draw(int radius){
        System.out.println("准备画圆所需要的环境,其他的东东....比如:画一个白色圆圈");
        Draw draw = new Draw(radius);
        draw.draw();

        System.out.println("画圆..." + radius);
    }

    public void draw2(int radius){
        System.out.println("准备画圆所需要的环境,其他的东东....比如:画一个黑色圆圈");
        Draw draw = new Draw(radius);
        draw.draw();

        System.out.println("画圆..." + radius);
    }

    public static void main(String[] args) {
        Circle circle = new  Circle();
        circle.draw(1);
    }
}

      三. 局部内部类
       局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类, 所以类的作用范围仅限于该方法中,而类生成的对象也只能在该方法中使用,另外,由于是在方法中定义, 因此区域内嵌类不能加上 private , protected , public 中的任何一个修饰符,不能包含静态成员。
         局部内部类示例:





       四. 静态内部类

         1. 在静态内部类中,非静态方法可以访问外部类静态属性,但不能访问非静态属性
         2. 可以访问内部类定义的静态属性,也可以访问非静态属性
         3. 静态方法,只能访问静态属性或方法,不能访问非静态方法或属性,不过内部类和外部类
      
          五. 匿名内部类

            //匿名内部类创建对象方式:等价于InterInner interImpl = new InterInnerImpl();
        //不一样的地方是:没有类名
        //1、继承某一个类
        //2、实现某一个接口
        //3、在任何地方都可以创建匿名内部类

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口


实例1:不使用匿名内部类来实现抽象方法
abstract class Person {
     public abstract void eat();
}
 
class Child  extends Person {
     public void eat() {
         System.out.println( "eat something" );
     }
}
 
public class Demo {
     public static void main(String[] args) {
         Person p =  new Child();
         p.eat();
     }
}

运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类


实例2:匿名内部类的基本实现
abstract class Person {
     public abstract void eat();
}
 
public class Demo {
     public static void main(String[] args) {
         Person p =  new Person() {
             public void eat() {
                 System.out.println( "eat something" );
             }
         };
         p.eat();
     }
}

运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上


实例3:在接口上使用匿名内部类
interface Person {
     public void eat();
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p =  new Person() {
             public void eat() {
                 System.out.println( "eat something" );
             }
         };
         p.eat();
     }
}

运行结果:eat something

 

由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口


实例4:Thread类的匿名内部类实现
public class Demo {
     public static void main(String[] args) {
         Thread t =  new Thread() {
             public void run() {
                 for ( int i =  1 ; i <=  5 ; i++) {
                     System.out.print(i +  " " );
                 }
             }
         };
         t.start();
     }
}

运行结果:1 2 3 4 5

实例5:Runnable接口的匿名内部类实现
public  class  Demo {
     public static void main(String[] args) {
         Runnable r =  new Runnable() {
             public void run() {
                 for ( int i =  1 ; i <=  5 ; i++) {
                     System.out.print(i +  " " );
                 }
             }
         };
         Thread t =  new Thread(r);
         t.start();
     }
}

运行结果:1 2 3 4 5




     
     
 
内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值