Java学习日志——super关键字

 super关键字代表父类对象,主要有两个用途:
◆调用父类的构造方法;
◆访问父类的属性和方法。


1.调用父类的构造方法
    在Java中父类和子类属性的初始化过程是各自完成的,虽然构造方法不能够继承,但通过使用super关键字在子类构造方法中可以调用父类的构造方法,以便完成父类的初始化。
    以Person类和Teacher类为例,演示在子类构造方法中可以调用父类的构造方法,以便完成父类的初始化。
Person类:
public class Person{
       private String name;
       private int age;
       private String gender;
       public Person(){
              System.out.println("无参数的构造方法");
       }
       public Person(String name,int age,String gender){
               System.out.println("有参数的构造方法");
               this.name=name;
               this.age=age;
               this.gender=gender;
       }
}
Teacher类:
public class Teacher extends Person{
       private float salary;
       public Teacher(){
       }
       public Teacher(String name,int age,String gender,float salary){
              super(name,age,gender);
              this.salary=salary;
       }
}
    上述代码,再teacher类中定义了一个缺省的构造方法(不含参数的构造方法)和大四个参数的构造方法。在第二个构造方法中使用super(name,age,gender)调用父类的构造方法Person(name,age,gender),将传递过来的参数向上传递来完成从父类继承属性的初始化。

当执行下面语句时:

Teacher john=new Teacher("john",34,"male"3000);

会将name,age,gender,salary分别初始化为john,34,male,3000。

若在子类的构造方法没有明确写明调用父类构造方法,则系统会自动调用父类不带参数的构造方法,即执行“super()”。


2.访问父类的属性和方法

     除了调用直接父类的构造方法,通过在此类中使用super做前缀外,还可以引用父类中被子类隐藏(即子类中有与父类同名的属性)的属性和被子类覆盖的方法。

    当子类的属性与父类的属性同名时,可用“super.方法名(参数列表)”的方式来访问父类中的方法。
Person类:
public class Person{
       private String name;
       private int age;
       private String gender;
       public Person(){
              System.out.println("无参数的构造方法");
       }
       public Person(String name,int age,String gender){
               System.out.println("有参数的构造方法");
               this.name=name;
               this.age=age;
               this.gender=gender;
       }
       public void print(){
               //使用super.print()调用父类的print()方法
               super.print();
               System.out.println("salary:"+salary);
       }
}

Teacher类:

public class Teacher extends Person{
       private float salary;
       public Teacher(){
       }
       public Teacher(String name,int age,String gender,float salary){
              super(name,age,gender);
              this.salary=salary;
       }
       public void print(){
              //使用super.print()调用父类的print()方法
              super.print();
              System.out.println("salary:"+salary);
       }
}
        上述代码在Teacher类的print()方法内部使用super.print()调用了父类Person的print()方法,从而实现复用。在main()方法中,执行下列代码:
Teacher john=new Teacher("john",34,"male",3000);
john.print();
执行结果如下:
有参数的构造方法
name:john
age:34
gender:male
salary:3000.0
      从结果可以看到,在Teacher的print()方法中,通过super.print()调用了父类Person的print()方法,从而输出了name,age,gender属性的内容。

### Java中try语句块的作用 `try` 语句块的主要作用是捕获可能发生的异常,从而防止程序因未处理的异常而终止执行。当一段代码可能会引发异常时,可以将其放置在 `try` 块中,以便对其进行监控和处理[^1]。 例如,在文件读取操作中,如果尝试打开一个不存在的文件,则会抛出 `FileNotFoundException` 异常。如果没有适当处理该异常,整个程序将会中断。因此,将此类代码放入 `try` 块中可以帮助开发者更好地控制程序的行为。 ```java try { FileReader fileReader = new FileReader("example.txt"); } catch (FileNotFoundException e) { System.out.println("File not found: " + e.getMessage()); } ``` 上述代码展示了如何使用 `try` 和 `catch` 来捕捉并处理潜在的异常情况[^2]。 --- ### 使用场景分析 #### 场景一:资源管理 对于需要显式关闭的资源(如数据库连接、文件流等),可以通过传统的 `try-catch-finally` 或更现代的 `try-with-resources` 方式来确保资源被正确释放[^3]。 传统方法: ```java BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("data.txt")); String line = reader.readLine(); while (line != null) { System.out.println(line); line = reader.readLine(); } } catch (IOException e) { System.err.println("Error reading the file: " + e.getMessage()); } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) { System.err.println("Error closing the reader: " + ex.getMessage()); } } } ``` 现代化方式 (`try-with-resources`): ```java try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.err.println("Error reading the file: " + e.getMessage()); } ``` 以上两种方式均能有效管理资源,但推荐使用 `try-with-resources`,因为它不仅简洁而且减少了手动干预的可能性。 #### 场景二:多异常处理 有时单段代码可能触发多种类型的异常,此时可以在同一个 `try` 块之后附加多个 `catch` 子句分别处理不同类别的异常。 示例代码如下: ```java try { int result = divide(10, 0); // 可能抛出 ArithmeticException FileWriter writer = new FileWriter("output.txt"); // 可能抛出 IOException } catch (ArithmeticException ae) { System.out.println("Division by zero error."); } catch (IOException ioe) { System.out.println("I/O operation failed."); } ``` 此片段说明了针对不同类型异常设计独立解决方案的重要性。 #### 场景三:自定义异常 除了内置的标准异常外,还可以根据实际需求创建自己的异常类别,并通过 `throw` 关键字主动抛出这些异常对象供外部逻辑进一步解析或记录日志信息。 实例演示: ```java class InvalidAgeException extends Exception { public InvalidAgeException(String message) { super(message); } } public class AgeValidator { public static void validate(int age) throws InvalidAgeException { if (age < 0 || age > 150) { throw new InvalidAgeException("Invalid age value provided!"); } } public static void main(String[] args) { try { validate(-5); } catch (InvalidAgeExceptioniae) { System.out.println(iae.getMessage()); } } } ``` 这里体现了自定义异常的应用价值——增强业务规则表达能力的同时也提高了可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值