7-1 Circle类 (20分)

本文介绍了一个简单的Circle类的设计与实现,包括构造方法、属性设置与获取、面积计算等基本功能,并展示了如何在Main类中实例化Circle对象进行测试。

7-1 Circle类 (20分)

a 定义圆类Circle,其中包括:

  1. 成员变量定义 private int radius
  2. 方法定义 包括下列要求
  3. 定义无参构造方法 ,给radius赋值为2,并添加语句System.out.println(“this is a
    constructor”);
  4. 定义有参构造方法
    ,接收用户给给radius赋值,如果用户输入半径为<=0,则让半径的值为2,并添加语句System.out.println(“this
    is a constructor with para”);
  5. 为radius半径添加setter方法,接收用户输入的半径,如果用户输入半径为<=0,则让半径的值为2
  6. 为radius半径添加getter方法,返回用户输入的半径
  7. 定义求面积方法public int gerArea(),π使用Math.PI代替,面积的结果强制转换为int返回
  8. 定义toString方法,public String toString( )方法体为:
    return “Circle [radius=” + radius + “]”;

b定义Main类,在main方法中,完成下列操作

  1. .定义并创建Circle的第一个对象c1,并使用println方法输出c1
  2. 求c1的面积并输出
  3. 定义并创建Circle的第一个对象c2,并使用println方法输出c2
  4. 从键盘接收整数半径,并赋值给c2的半径,使用println方法输出c2
  5. 求c2的面积并输出
  6. 从键盘接收整数半径,并创建Circle的第三个对象c3,并将用户输入整数半径通过有参构造方法传递给出c3,使用println方法输出c3
  7. 求c3的面积并输出

输入格式:
从键盘输入一个整数半径

输出格式:
分别输出c1和c2对象的信息

输入样例:
在这里给出一组输入。例如:

4
5
···
-4
-2

输出样例:
在这里给出相应的输出。例如:

this is a constructor
Circle [radius=2]
c1:area=12
this is a constructor
Circle [radius=2]
Circle [radius=4]
c2:area=50
this is a constructor with para
Circle [radius=5]
c3:area=78
this is a constructor
Circle [radius=2]
c1:area=12
this is a constructor
Circle [radius=2]
Circle [radius=2]
c2:area=12
this is a constructor with para
Circle [radius=2]
c3:area=12

解决:

import java.util.Scanner;

class Circle{
	private int radius;
	public Circle(){
		radius = 2;
		System.out.println("this is a constructor");
	}
	public Circle(int r){
		if(r <= 0)
			radius = 2;
		else 
			radius = r;
		System.out.println("this is a constructor with para");
	}
	public void setter(int r){
		if(r <= 0)
			radius = 2;
		else 
			radius = r;
	}
	public int getter(){
		return radius;
	}
	public int getArea(){
		double A = radius*radius*Math.PI;
		return (int)A;
	}
	public String toString(){
		return "Circle [radius=" + radius + "]";
	}
}

public class Main{
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		Circle c1 = new Circle();
		System.out.println(c1.toString());
		System.out.println("c1:area="+c1.getArea());
		Circle c2 = new Circle();
		System.out.println(c2.toString());
		c2.setter(in.nextInt());
		System.out.println(c2.toString());
		System.out.println("c2:area="+c2.getArea());
		Circle c3 = new Circle(in.nextInt());
		System.out.println(c3.toString());
		System.out.println("c3:area="+c3.getArea());
	}
}
<think>我们计划开发一个商城页面,包含以下核心功能:1.侧边栏(左侧)2.商品列表(右侧)3.与商品的联动设计思路:-使用Row布局,左侧为列表(垂直滚动),右侧为商品网格列表(垂直滚动)-点击项时,右侧商品列表自动滚动到对应的商品区域-右侧商品列表滚动时,左侧项自动高亮当前显示的技术要点:1.使用`List`组件实现侧边栏2.使用`Grid`或`List`组件实现商品列表3.使用`Scroll`和`Scroller`实现联动滚动4.使用`@State`和`@Link`管理状态数据结构:```typescript//interfaceCategory{id:number;name:string;icon:ResourceStr;//图标资源}//商品interfaceProduct{id:number;categoryId:number;name:string;price:number;image:ResourceStr;}```页面结构:```mermaidgraphLRA[页面]-->B[左侧列表]A-->C[右侧商品列表]B-->B1[1]B-->B2[项2]C-->C1[1商品网格]C-->C2[2商品网格]```代码实现步骤:1.定义页面组件结构2.初始化和商品数据3.构建左侧列表4.构建右侧商品列表(按组)5.实现点击滚动到对应商品区域6.实现滚动商品列表时更新左侧选中具体实现:</think># 鸿蒙商城页面开发指南 ## 设计思路与功能规划 基于ArkTS在鸿蒙系统中实现商城页面,需要包含以下核心功能: ```mermaid graph TD A[页面] --> B[顶部导航栏] A --> C[侧边导航] A --> D[商品网格布局] A --> E[筛选排序功能] A --> F[交互反馈机制] ``` ## 实现代码 ### 1. 定义数据结构 ```typescript // 商品 interface Category { id: number; name: string; icon: ResourceStr; } // 商品信息 interface Product { id: number; name: string; price: number; discount?: number; // 折扣率 sales: number; // 销量 stock: number; // 库存 image: ResourceStr; categoryId: number; } // 筛选条件 interface FilterOptions { sortBy: 'default' | 'priceAsc' | 'priceDesc' | 'sales'; priceRange: [number, number]; onlyInStock: boolean; } ``` ### 2. 页面实现 ```typescript @Entry @Component struct CategoryPage { // 数据 @State categories: Category[] = [ { id: 1, name: '手机数码', icon: $r('app.media.category_phone') }, { id: 2, name: '电脑办公', icon: $r('app.media.category_computer') }, { id: 3, name: '家用电器', icon: $r('app.media.category_appliance') }, { id: 4, name: '美妆护肤', icon: $r('app.media.category_beauty') }, { id: 5, name: '食品生鲜', icon: $r('app.media.category_food') }, { id: 6, name: '服装鞋包', icon: $r('app.media.category_clothes') }, { id: 7, name: '母婴玩具', icon: $r('app.media.category_baby') }, { id: 8, name: '运动户外', icon: $r('app.media.category_sports') }, ]; // 商品数据 @State products: Product[] = [ { id: 101, name: '华为P60 Pro', price: 5988, sales: 2560, stock: 120, image: $r('app.media.product_phone1'), categoryId: 1 }, { id: 102, name: 'iPhone 15', price: 6999, sales: 1890, stock: 85, image: $r('app.media.product_phone2'), categoryId: 1 }, // 更多商品数据... ]; @State selectedCategoryId: number = 1; @State filterOptions: FilterOptions = { sortBy: 'default', priceRange: [0, 10000], onlyInStock: false }; // 筛选后的商品列表 @State filteredProducts: Product[] = []; aboutToAppear() { this.filterProducts(); } // 筛选商品 filterProducts() { // 1. 按筛选 let result = this.products.filter(p => p.categoryId === this.selectedCategoryId); // 2. 按库存筛选 if (this.filterOptions.onlyInStock) { result = result.filter(p => p.stock > 0); } // 3. 按价格范围筛选 result = result.filter(p => p.price >= this.filterOptions.priceRange[0] && p.price <= this.filterOptions.priceRange[1] ); // 4. 排序 switch (this.filterOptions.sortBy) { case 'priceAsc': result.sort((a, b) => a.price - b.price); break; case 'priceDesc': result.sort((a, b) => b.price - a.price); break; case 'sales': result.sort((a, b) => b.sales - a.sales); break; } this.filteredProducts = result; } // 切换 changeCategory(id: number) { this.selectedCategoryId = id; this.filterProducts(); } // 改变排序方式 changeSort(method: 'default' | 'priceAsc' | 'priceDesc' | 'sales') { this.filterOptions.sortBy = method; this.filterProducts(); } // 跳转商品详情 navigateToDetail(productId: number) { // 实际项目中通过路由跳转 console.log(`跳转到商品详情: ${productId}`); } // 商品卡片组件 @Builder productCard(product: Product) { Column({ space: 8 }) { // 商品图片 Stack({ alignContent: Alignment.TopEnd }) { Image(product.image) .width('100%') .aspectRatio(1) .objectFit(ImageFit.Cover) .borderRadius(8) // 折扣标签 if (product.discount) { Text(`${(product.discount * 100).toFixed(0)}折`) .fontSize(12) .fontColor(Color.White) .padding({ left: 6, right: 6, top: 2, bottom: 2 }) .backgroundColor('#ff5500') .borderRadius(4) .margin(8) } } // 商品名称 Text(product.name) .fontSize(14) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .width('100%') // 价格区域 Row({ space: 4 }) { Text(`¥${product.price.toFixed(2)}`) .fontSize(16) .fontColor('#ff5500') .fontWeight(FontWeight.Bold) if (product.discount) { Text(`¥${(product.price / product.discount).toFixed(2)}`) .fontSize(12) .fontColor('#999') .decoration({ type: TextDecorationType.LineThrough }) } } // 销量和库存 Row({ space: 8 }) { Text(`销量: ${product.sales}`) .fontSize(12) .fontColor('#666') Text(product.stock > 0 ? '有货' : '缺货') .fontSize(12) .fontColor(product.stock > 0 ? '#07c160' : '#ff5500') } } .width('100%') .padding(8) .backgroundColor(Color.White) .borderRadius(12) .onClick(() => this.navigateToDetail(product.id)) } // 项组件 @Builder categoryItem(category: Category) { Column({ space: 8 }) { Image(category.icon) .width(40) .height(40) Text(category.name) .fontSize(14) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) } .padding(12) .width('100%') .backgroundColor(this.selectedCategoryId === category.id ? '#fff2e8' : Color.White) .borderRadius(8) .onClick(() => this.changeCategory(category.id)) } // 筛选工具栏 @Builder filterToolbar() { Row({ space: 16 }) { // 综合排序 Button('综合', { type: ButtonType.Capsule }) .stateEffect(this.filterOptions.sortBy === 'default') .backgroundColor(this.filterOptions.sortBy === 'default' ? '#fff2e8' : '#f5f5f5') .fontColor(this.filterOptions.sortBy === 'default' ? '#ff5500' : '#333') .onClick(() => this.changeSort('default')) // 价格排序 Button('价格', { type: ButtonType.Capsule }) .stateEffect(true) .backgroundColor( this.filterOptions.sortBy === 'priceAsc' || this.filterOptions.sortBy === 'priceDesc' ? '#fff2e8' : '#f5f5f5' ) .fontColor( this.filterOptions.sortBy === 'priceAsc' || this.filterOptions.sortBy === 'priceDesc' ? '#ff5500' : '#333' ) .onClick(() => { if (this.filterOptions.sortBy === 'priceDesc') { this.changeSort('priceAsc'); } else { this.changeSort('priceDesc'); } }) // 销量排序 Button('销量', { type: ButtonType.Capsule }) .stateEffect(this.filterOptions.sortBy === 'sales') .backgroundColor(this.filterOptions.sortBy === 'sales' ? '#fff2e8' : '#f5f5f5') .fontColor(this.filterOptions.sortBy === 'sales' ? '#ff5500' : '#333') .onClick(() => this.changeSort('sales')) // 筛选按钮 Button('筛选', { type: ButtonType.Capsule }) .backgroundColor('#f5f5f5') .fontColor('#333') .onClick(() => { // 实际项目中打开筛选面板 console.log('打开筛选面板'); }) } .width('100%') .padding(12) .backgroundColor(Color.White) } build() { Row() { // 左侧导航 Scroll() { Column() { ForEach(this.categories, (category: Category) => { this.categoryItem(category) }) } .padding(8) } .scrollBar(BarState.Off) .width('25%') // 右侧商品区域 Column() { // 筛选工具栏 this.filterToolbar() // 商品网格 Scroll() { Grid() { ForEach(this.filteredProducts, (product: Product) => { GridItem() { this.productCard(product) } }) } .columnsTemplate('1fr 1fr') .columnsGap(8) .rowsGap(8) .padding(8) } .scrollBar(BarState.Off) .width('100%') } .layoutWeight(1) .backgroundColor('#f5f5f5') } .width('100%') .height('100%') .backgroundColor('#f5f5f5') } } ``` ## 核心技术解析 ### 1. 响应式数据管理 - 使用`@State`装饰器管理和商品数据状态 - 通过`filterProducts`方法实现数据的动态筛选和排序 -选择或筛选条件变化时,自动更新商品列表 ### 2. 布局设计 - **侧边导航**:使用`Scroll`+`Column`实现垂直滚动列表 - **商品网格**:使用`Grid`组件实现两列商品展示 - **筛选工具栏**:使用`Row`+`Button`实现水平排列的筛选选项 ### 3. ArkTS特性应用 - **@Builder装饰器**:创建可复用的UI组件(`productCard`和`categoryItem`) - **条件渲染**:根据商品状态显示不同UI元素(折扣标签、库存状态) - **样式扩展**:使用链式调用设置组件样式 ### 4. 交互设计 - **选择**:点击项高亮显示并刷新商品列表 - **商品点击**:跳转到商品详情页 - **排序切换**:点击排序按钮改变商品排序方式 ## 性能优化建议 1. **懒加载优化**: ```typescript // 使用LazyForEach优化长列表性能 LazyForEach(this.filteredProducts, (product: Product) => { GridItem() { this.productCard(product) } }) ``` 2. **图片资源优化**: ```typescript Image(product.image) .width('100%') .aspectRatio(1) .objectFit(ImageFit.Cover) .borderRadius(8) .interpolation(ImageInterpolation.High) // 高质量插值 .renderMode(ImageRenderMode.Original) // 原始质量渲染 ``` 3. **数据页加载**: ```typescript @State currentPage: number = 1; @State pageSize: number = 20; loadMoreData() { // 模拟页加载 const startIndex = (this.currentPage - 1) * this.pageSize; const newData = this.allProducts.slice(startIndex, startIndex + this.pageSize); this.products = [...this.products, ...newData]; this.currentPage++; } // 在Scroll组件中添加滚动到底部事件 .onReachEnd(() => { this.loadMoreData(); }) ``` ## 相关扩展功能 ### 1. 添加搜索功能 ```typescript @State searchKeyword: string = ''; // 在筛选方法中添加搜索条件 if (this.searchKeyword) { result = result.filter(p => p.name.includes(this.searchKeyword) ); } // 在顶部添加搜索框 Search({ placeholder: '搜索商品' }) .onChange(value => { this.searchKeyword = value; this.filterProducts(); }) ``` ### 2. 添加购物车快捷操作 ```typescript // 在商品卡片中添加购物车按钮 Button($r('app.media.icon_cart'), { type: ButtonType.Circle }) .width(32) .height(32) .position({ x: '85%', y: '85%' }) .onClick(() => { // 添加到购物车逻辑 }) ``` ## 相关问题 1. 如何实现页面与商品详情页的数据传递?[^1] 2. 如何处理大量数据的性能优化问题? 3. 如何在ArkTS中实现自定义的下拉刷新功能?[^2] 4. 如何在不同屏幕尺寸上适配页面的布局?[^3] [^1]: 鸿蒙实战:ArkTs 开发一个鸿蒙应用。ArkTS 通过 struct 声明自定义组件名,使用 @Entry 和 @Component 装饰的自定义组件作为页面的入口。 [^2]: 鸿蒙HarmonyOS开发框架—ArkTS语言(基本语法 一)_鸿蒙 使用 ts。除此之外,ArkTS扩展了多种语法范式来使开发更加便捷。 [^3]: 针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solidare

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值