java的传值练习

本文通过具体的Java代码示例介绍了如何定义和使用类与对象,包括Vehicle类展示速度和功率的设置与获取,TV类实现频道切换及显示当前节目的功能,以及Family类模拟家庭成员对电视的操作。

//所有的java的程序只要一个程序入口,其余的为方法类等:

//Vehicle类,刻画速度功率

public class Vehicle {
	//声明double类型的变量speed,刻画速度
	double speed=0;
	//声明int型的变量power,刻画功率
	int power=0;
	void speedUp(int s){
		speed=s;
	}
	void speedDown(int d){
		speed=d;
	}
	void setPower(int p){
		power=p;
	}
	int  getPower(){
		return  power;
	}
	double getSpeed(){
		return speed;
	}

}

//TV看电视类:

public class TV {
	//电视频道
	int channel=0;
	void setChannel(int m){
		if(m>1){
			channel=m;
		}
	}
	int getChannel(){
		return channel;
	}
	void showProgram(){
		switch(channel){
		case 1: System.out.println("综合频道");break;
		case 2: System.out.println("经济频道");break;
		case 3: System.out.println("文艺频道");break;
		case 4: System.out.println("国际频道");break;
		case 5: System.out.println("体育频道");break;
		default: System.out.println("不能收看"+channel+"频道");break;
		}
		
	}
}

//家庭换台:

public class Family {
	TV homeTV;
	void buyTV(TV tv){
		homeTV=tv;
	}
	void remoteControl(int m){
		homeTV.setChannel(m);
	}
	void seeTV(){
	 homeTV.showProgram();
	}
}

//换台操作:

public class MainClass {
	public static void main(String[] args){
		tv haierTV=new tv();
		//haierTV调用setChannel(int m),并向m传递5;
		haierTV.setChannel(5);
		System.out.println("haierTV的电视频道是"+haierTV.getChannel());
		Family zhangsanFamily=new Family();
		zhangsanFamily.buyTV(haierTV);
		System.out.println("zhangsanFamily开始看电视");
		zhangsanFamily.seeTV();
		int m=2;
		System.out.println("zhangsanFamily将电视转换为"+m+"频道");
		zhangsanFamily.remotecontrol(m);
		System.out.println("haierTV的频道是"+haierTV.getChannel());
		System.out.println("zhangsanFamily再看电视节目");
		zhangsanFamily.seeTV();
	}
}


//程序执行入口:

public class User {
	public static void main(String[] args){
		//描述车辆
		Vehicle car1=new Vehicle();
		Vehicle car2=new Vehicle();
		car1.setPower(128);
		car2.setPower(76);
		System.out.println("car1的功率是:"+car1.getPower());
		System.out.println("car2的功率是:"+car2.getPower());
		car1.speedUp(80);
		car2.speedUp(80);
		System.out.println("car1目前的速度是:"+car1.getSpeed());
		System.out.println("car2目前的速度是:"+car2.getSpeed());
		car1.speedDown(10);
		car2.speedDown(20);
		System.out.println("car1目前的速度是:"+car1.getSpeed());
		System.out.println("car2目前的速度是:"+car2.getSpeed());
		//家中的电视机
		TV haierTV=new TV();
		haierTV.setChannel(5);
		System.out.println("haierTV的电视频道是"+haierTV.getChannel());
		Family zhangsanFamily=new Family();
		zhangsanFamily.buyTV(haierTV);
		System.out.println("zhangsanFamily开始看电视");
		zhangsanFamily.seeTV();
		int m=2;
		System.out.println("zhangsanFamily将电视转换为"+m+"频道");
		zhangsanFamily.remoteControl(m);
		System.out.println("haierTV的频道是"+haierTV.getChannel());
		System.out.println("zhangsanFamily再看电视节目");
		zhangsanFamily.seeTV();
		//共饮同井水
		Village.setWaterAmount(200);
		int leftWater=Village.waterAmount;
		System.out.println("水井中有"+leftWater+"升水");
		Village zhaoZhuang,maJiaHeZhi;
		zhaoZhuang=new Village("赵庄");
		maJiaHeZhi=new Village("马家河子");
		zhaoZhuang.setPeopleNum(80);
		maJiaHeZhi.setPeopleNum(120);
		zhaoZhuang.drinkWater(50);
		leftWater=maJiaHeZhi.lookWaterAmount();
		String name=maJiaHeZhi.name;
		System.out.println(name+"发现水井中有"+leftWater+"升水");
		maJiaHeZhi.drinkWater(100);
		leftWater=zhaoZhuang.lookWaterAmount();
		name=zhaoZhuang.name;
		System.out.println(name+"发现水井中有"+leftWater+"升水");
		int peopleNum=zhaoZhuang.getPeopleNum();
		System.out.println("赵庄的人口:"+peopleNum);
		peopleNum=maJiaHeZhi.getPeopleNum();
		System.out.println("马家河子的人口:"+peopleNum);
		
		
		
	}

}


输出结果:




<think>我们正在讨论的是RNDIS相关的内核配置。RNDIS(Remote Network Driver Interface Specification)是微软定义的USB网络设备协议,允许USB设备充当网络适配器。在Linux中,RNDIS可以通过USB Gadget框架实现,使得Linux设备(如嵌入式系统)可以通过USB连接到主机并作为网络设备使用。 根据用户提供的引用[1],我们看到了一些与USB网络相关的内核配置选项,其中包括: - `CONFIG_USB_USBNET=y`:启用通用的USB网络驱动框架。 - `CONFIG_USB_NET_RNDIS_HOST=y`:这个选项实际上用于主机端(host)驱动,它使得Linux主机可以支持连接到RNDIS设备(例如Android手机或Windows设备)。但是,用户询问的是如何配置Linux设备作为RNDIS设备(gadget模式),因此我们需要关注的是Gadget驱动中的RNDIS功能。 对于Linux设备作为RNDIS设备(即USB从设备模式),我们需要配置的是Gadget驱动中的RNDIS功能。相关的配置选项包括: 1. **核心配置**: - `CONFIG_USB_GADGET=y`:启用USB Gadget支持。 - `CONFIG_USB_CONFIGFS=y`:允许通过用户空间配置USB Gadget功能(推荐,因为它更灵活)。 - `CONFIG_USB_CONFIGFS_RNDIS=y`:在ConfigFS框架下启用RNDIS功能。 2. **具体功能驱动**: - `CONFIG_USB_ETH=y`:启用USB以太网Gadget驱动(这个驱动支持多种子协议,包括RNDIS)。 - `CONFIG_USB_ETH_RNDIS=y`:在USB以太网Gadget驱动中启用RNDIS协议支持。 注意:在较新的内核中,RNDIS功能通常集成在`CONFIG_USB_ETH`驱动中,并通过`CONFIG_USB_ETH_RNDIS`选项来启用RNDIS协议。 ### 配置步骤 1. **通过menuconfig配置内核**: ```bash Device Drivers ---> [*] USB support ---> <*> USB Gadget Support ---> [*] USB functions configurable through configfs (CONFIG_USB_CONFIGFS) [*] RNDIS (CONFIG_USB_CONFIGFS_RNDIS) <*> Ethernet Gadget (CONFIG_USB_ETH) # 这个选项会包含RNDIS支持 [*] RNDIS support (CONFIG_USB_ETH_RNDIS) ``` 或者,如果你使用的是旧内核(没有ConfigFS),你可能需要选择: ```bash Device Drivers ---> [*] USB support ---> <*> USB Gadget Support ---> <*> Ethernet Gadget (with CDC Ethernet support) (CONFIG_USB_ETH) [*] RNDIS support (CONFIG_USB_ETH_RNDIS) ``` 2. **编译并安装内核**。 3. **使用ConfigFS配置RNDIS Gadget**(以ConfigFS方式为例): - 挂载configfs(如果尚未挂载): ```bash mount -t configfs none /sys/kernel/config ``` - 创建gadget目录: ```bash cd /sys/kernel/config/usb_gadget mkdir g1 cd g1 ``` - 设置USB Vendor ID和Product ID(例如,RNDIS通常使用0x1234和0x5678,但实际使用中应使用合法的ID): ```bash echo 0x1234 > idVendor echo 0x5678 > idProduct ``` - 创建配置: ```bash mkdir configs/c.1 ``` - 启用RNDIS功能: ```bash mkdir functions/rndis.usb0 ln -s functions/rndis.usb0 configs/c.1 ``` - 指定UDC控制器(需要根据你的硬件替换`dwc3.0.auto`): ```bash echo "dwc3.0.auto" > UDC ``` 4. **在主机上验证**:连接USB线到主机(如WindowsLinux主机),主机应该会识别到一个新的网络设备。 ### 注意事项 - **主机驱动**:在Windows主机上,通常需要安装RNDIS驱动Windows自带)。Linux主机需要启用`CONFIG_USB_NET_RNDIS_HOST`(如引用[1]所示)来支持作为主机连接RNDIS设备。 - **复合设备**:如果你需要同时启用多个功能(例如RNDIS和Mass Storage),可以通过ConfigFS创建多个功能并链接到同一个配置中。 ### 调试 如果设备无法被识别,可以检查: - 内核日志:`dmesg` 查看是否有错误信息。 - 确保UDC控制器驱动已加载并工作正常。 - 检查ConfigFS配置步骤是否正确。 ### 总结表格 | **配置选项** | **作用** | |-------------------------------|----------------------------------------| | `CONFIG_USB_GADGET` | 启用USB Gadget支持(必需) | | `CONFIG_USB_CONFIGFS` | 启用ConfigFS配置方式(推荐) | | `CONFIG_USB_CONFIGFS_RNDIS` | 在ConfigFS中启用RNDIS功能 | | `CONFIG_USB_ETH` | 启用USB以太网Gadget驱动(包含RNDIS) | | `CONFIG_USB_ETH_RNDIS` | 在USB以太网Gadget驱动中启用RNDIS协议 | §§相关问题§§ 1. 如何通过ConfigFS配置同时支持RNDIS和Mass Storage的复合USB设备? 2. 在Linux主机上如何加载RNDIS主机驱动以识别远程的RNDIS设备? 3. RNDIS协议与CDC-ECM协议在USB网络传输中有何性能差异? 4. 如何调试USB Gadget枚举失败的问题? [^1]: 在USB网络适配器的配置中,`CONFIG_USB_NET_RNDIS_HOST`用于主机端支持RNDIS设备。 [^2]: 在`f_mass_storage.c`中,`struct fsg_config`用于配置大容量存储Gadget,但本问题中未直接使用。</think>### RNDIS 内核配置详解 RNDIS(Remote Network Driver Interface Specification)是微软定义的 USB 网络协议标准,允许 USB 设备作为虚拟网卡使用。在 Linux 内核中,相关配置分为**主机端**(识别 RNDIS 设备)和**设备端**(模拟 RNDIS 网卡)两部分: --- #### 一、主机端配置(识别 RNDIS 设备) 当 Linux 作为**主机**时(如 PC 连接 Android 手机),需启用以下选项识别 RNDIS 设备: ```bash Device Drivers → [*] Network device support → [*] USB Network Adapters → <*> USB RNDIS Host support # CONFIG_USB_NET_RNDIS_HOST=y ``` ![内核配置路径示意图](https://example.com/rndis_host_config.png) > **关键说明**: > - 此配置使 Linux 主机能识别 Windows/Android 设备的 RNDIS 网络接口[^1] > - 依赖 `CONFIG_USB_USBNET`(通用 USB 网络框架) > - 连接后通过 `ifconfig -a` 可看到 `usb0` 或 `rndis0` 接口 --- #### 二、设备端配置(模拟 RNDIS 网卡) 当 Linux 设备作为 **USB 从设备**时(如嵌入式开发板),需通过 Gadget 框架模拟 RNDIS 网卡: ```bash Device Drivers → [*] USB support → <*> USB Gadget Support → [*] USB functions configurable through configfs # CONFIG_USB_CONFIGFS=y <*> Ethernet Gadget → # CONFIG_USB_ETH=y [*] RNDIS support # CONFIG_USB_ETH_RNDIS=y ``` > **关键说明**: > 1. **必须启用复合设备支持**(`CONFIG_USB_CONFIGFS`) > 2. RNDIS 协议实现位于 `drivers/usb/gadget/function/f_rndis.c` > 3. 需匹配 UDC 控制器驱动(如 `CONFIG_USB_DWC3`) --- #### 三、动态启用 RNDIS Gadget 通过 ConfigFS 动态配置(无需重新编译内核): ```bash # 挂载 configfs mount -t configfs none /sys/kernel/config # 创建 Gadget cd /sys/kernel/config/usb_gadget mkdir g1 && cd g1 # 设置设备描述符(VID/PID) echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget # 创建 RNDIS 功能 mkdir functions/rndis.usb0 # 绑定到配置 mkdir configs/c.1 ln -s functions/rndis.usb0 configs/c.1 # 启用 UDC 控制器 echo "dwc3.0.auto" > UDC # 根据实际硬件修改 ``` 启用后主机将识别为 **RNDIS 兼容网卡**,可通过 `ip addr` 分配 IP[^2]。 --- #### 四、配置参数优化 在 `f_rndis.c` 中可调整关键参数: ```c // 控制 RNDIS 响应速度(单位:毫秒) module_param(rndis_response_delay, uint, 0644); MODULE_PARM_DESC(rndis_response_delay, "RNDIS response delay in ms"); // 设置最大传输单元(默认 1514 字节) static struct eth_dev_ops rndis_ops = { .get_drvinfo = rndis_get_drvinfo, .check_connect = rndis_check_connect, .mtu = 1514, // 可修改为 9000 支持巨帧 }; ``` --- #### 五、验证与调试 | **验证方法** | **命令/操作** | **预期结果** | |---------------------------|----------------------------------|----------------------------------| | 主机识别设备 | `lsusb -v` | 显示 `RNDIS` 设备类 | | 网络接口状态 | `ip link show dev usb0` | 状态为 `UP` | | 数据传输测试 | `ping <设备IP>` | 收到 ICMP 回复 | | 查看内核日志 | `dmesg \| grep rndis` | 无错误提示 | **常见问题解决**: - **主机无法识别**:检查 `idVendor/idProduct` 是否冲突 - **频繁断连**:增大 `rndis_response_delay` 值(如 `100ms`) - **低速传输**:确认 UDC 支持 USB2.0/3.0(`cat /sys/class/udc/*/speed`) --- ### 总结表格 | **配置类型** | **内核选项** | **作用** | |--------------------|----------------------------------|-----------------------------------| | 主机端支持 | `CONFIG_USB_NET_RNDIS_HOST` | 识别外部 RNDIS 设备 | | 设备端核心 | `CONFIG_USB_CONFIGFS` | 启用动态配置框架 | | RNDIS 协议实现 | `CONFIG_USB_ETH_RNDIS` | 提供 RNDIS 协议栈 | | 硬件控制器 | `CONFIG_USB_DWC3` (示例) | 驱动 USB 物理接口 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值