You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin带提示用户输入与类实例化输出实现咨询

Kotlin 学生/教师类实现与用户输入处理

一、修正现有代码的错误

你原来的代码存在几个类型不匹配和构造函数问题,先修正这些基础问题:

  • streetAddress 应该是 String 类型(地址是文本,不是整数)
  • gpa 应该是 Double 类型(需要支持0.0-4.0的小数取值)
  • Teacher 继承 Student 时,必须传递父类的所有必填参数,这里我们给教师不需要的属性(GPA、Major)设置默认值,更符合实际场景

二、完整代码实现

open class Student(
    var firstName: String,
    var lastName: String,
    var streetAddress: String,
    var city: String,
    var state: String,
    var zip: Int,
    var gpa: Double,
    var major: String
) {
    // 统一打印所有属性的方法
    fun printInfo() {
        println("===== 个人信息 =====")
        println("FirstName: $firstName")
        println("LastName: $lastName")
        println("Street Address: $streetAddress")
        println("City: $city")
        println("State: $state")
        println("Zip: $zip")
        println("GPA: $gpa")
        println("Major: $major")
        println("===================")
    }
}

// Teacher继承Student,给GPA和Major设置默认值
class Teacher(
    firstName: String,
    lastName: String,
    streetAddress: String,
    city: String,
    state: String,
    zip: Int,
    gpa: Double = 0.0,
    major: String = "N/A"
) : Student(firstName, lastName, streetAddress, city, state, zip, gpa, major)

fun main() {
    // 收集学生信息
    println("请输入学生信息:")
    print("FirstName: ")
    val studentFirstName = readLine() ?: ""
    print("LastName: ")
    val studentLastName = readLine() ?: ""
    print("Street Address: ")
    val studentStreet = readLine() ?: ""
    print("City: ")
    val studentCity = readLine() ?: ""
    
    // 校验State必须是2位字符
    var studentState: String
    do {
        print("State(请输入2位字符): ")
        studentState = readLine() ?: ""
    } while (studentState.length != 2)
    
    // 校验Zip是4位整数
    var studentZip: Int
    do {
        print("Zip(请输入4位整数): ")
        val zipInput = readLine() ?: ""
        studentZip = zipInput.toIntOrNull() ?: 0
    } while (studentZip !in 1000..9999)
    
    // 校验GPA在0.0-4.0之间
    var studentGpa: Double
    do {
        print("GPA(请输入0.0-4.0之间的小数): ")
        val gpaInput = readLine() ?: ""
        studentGpa = gpaInput.toDoubleOrNull() ?: -1.0
    } while (studentGpa !in 0.0..4.0)
    
    print("Major: ")
    val studentMajor = readLine() ?: ""

    // 实例化学生并批量打印信息
    val student = Student(studentFirstName, studentLastName, studentStreet, studentCity, studentState, studentZip, studentGpa, studentMajor)
    println("\n您输入的学生信息如下:")
    student.printInfo()

    // 收集教师信息
    println("\n请输入教师信息:")
    print("FirstName: ")
    val teacherFirstName = readLine() ?: ""
    print("LastName: ")
    val teacherLastName = readLine() ?: ""
    print("Street Address: ")
    val teacherStreet = readLine() ?: ""
    print("City: ")
    val teacherCity = readLine() ?: ""
    
    var teacherState: String
    do {
        print("State(请输入2位字符): ")
        teacherState = readLine() ?: ""
    } while (teacherState.length != 2)
    
    var teacherZip: Int
    do {
        print("Zip(请输入4位整数): ")
        val zipInput = readLine() ?: ""
        teacherZip = zipInput.toIntOrNull() ?: 0
    } while (teacherZip !in 1000..9999)

    // 实例化教师并批量打印信息
    val teacher = Teacher(teacherFirstName, teacherLastName, teacherStreet, teacherCity, teacherState, teacherZip)
    println("\n您输入的教师信息如下:")
    teacher.printInfo()
}

三、关键说明

  1. 输入校验:针对State、Zip、GPA这些有格式要求的属性,用do-while循环确保输入符合规则,避免无效数据
  2. 统一打印:通过printInfo()方法统一输出格式,减少重复代码,也方便后续修改输出样式
  3. 空值处理:用readLine() ?: ""处理用户未输入直接回车的情况,避免空指针异常
  4. 继承逻辑:Teacher类复用Student的属性和方法,同时通过默认值简化教师实例化的参数传递

内容的提问来源于stack exchange,提问作者Tevin Douglas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:07:29