Java小记之方法重写与继承中的构造方法的规则

方法重写:


具有相同的方法名称,返回类型和参数列表(特别容易出错)

重写方法不能使用比被重写方法更严格的访问权限。


super关键字,来引用基类成分:

class FatherClass{

}

class ChildClass extends FatherClass{

}


继承中的构造方法

1.子类的构造过程中必须调用其父类(基类)的构造方法(没有父类就没有子类);

2. 子类可以在自己的构造方法中使用super(argument_list)来调用基类构造方法;

     ·使用this()调用本类的另外的构造方法;

     ·如果调用super,必须写在子类构造方法的第一行;

3. 子类构造方法中没写super,子类默认找到super中没写参数的构造方法;

    但是,如果子类方法中既没写super,super中也没有无参数的构造方法,程序报错。

例如:

class SuperClass{

private int n;

       SuperClass(){

        System.out.println("SuperClass()");  

     }

       SuperClass(int n){

      System.out.println("SuperClass("+n+")");  

      this.n = n;

      }

}

class SubClass extends SuperClass{

   private int n;

   SubClass (int n){

    System.out.println("SuperClass("+ n +")");

    this.n = n;  

   }  

   SubClass() {

   super(300);   // 调用父类中的构造方法;

    System.out.println("SuperClass()");  

   } 

}

  public class TestSuperSub {

   public static void main (String arg[]){

   SubClass sc1= new SubClass();

   SubClass sc2= new SubClass(400);

   }  

}

情况1:SubClass sc1= new SubClass(),并注释掉super(300);调用子类的构造方法,程序出错。因为子类的构造方法中必须调用父类构造方法;

情况2:super(300)写在System.语句的后面,程序出错。因为先调用父类构造方法,后子类;

情况3:注释掉 SubClass sc1= new SubClass();程序调用了子类的带参数的构造方法,结果为: 先打印 SuperClass();再打印SuperClass(400)。因为在子类的构造方法中未写出调用父类构造方法的语句,所以系统自动调用super中无参数的构造方法,也就是SuperClass();然后再打印自己的构造方法中的SuperClass(400)。

情况4:注释父类中无参数构造方法和SubClass sc1= new SubClass()语句,执行  SubClass sc2= new SubClass(400),程序报错。因为子类构造方法中为调用super()构造方法并且父类中没有不带参数的构造方法,则程序报错。


练习1:

分析输出结果,比较构造函数和一般成员函数的区别。

class A  {

protected void print(String s){

System.out.println(s);

}

A(){print("A()");}

public void f() {print("A:f()");}

}

class B extends A{

 B() {print("B()");  }

public void f() {print("B:f()");}

public static void main(String args[]) {

 B b = new B();

 b.f();

}

}

输出结果为:

A();

B:f();

解释:main 函数中,new出来的对象b 首先调用自己的构造方法,但是本身的构造方法并没有调用父类的构造方法,那么系统默认调用无参数的父类构造方法

A(); 该方法为打印出“A()”;然后,b.f() 调用了自身的类的方法f(),该方法为打印“B:f()”。


练习2:

class Person {

private String name;

       private String location;

  Person (String name) {

    this.name = name;

    location = "Beijing";}

  Person (String name, String location) {

   this.name = name; 

       this.location = location;

  }

  public String info() {

    return "name:"+name+

                  "location:"+location;

}

}

class Student extends Person  {

private String school;

        Student(String name, String school){

this (name,"beijing",school);  //this 调用类中的其他构造函数;

}

Student (String n, String l, String school){

super(n,l);

        this.school=school; 

}

public String info (){

return super.info()+"school:"+school; 

}

}

Public class Test {

  public static void main(String[] args){

     Person p1 = new Person ("A");  // 调用了person(String name)

        Person p2 = new Person ("B","Shanghai"); //调用了person(String name,String location)

        Student s1 = new Student("C", "S1");  //调用了Student(String name,String school)

        Student s2 = new Student ("C","Shanghai","S2"); //调用相应的student里的构造函数方法;

        System.out.println(p1.info());

System.out.println(p2.info());

    System.out.println(s1.info());

    System.out.println(s2.info());

    }

}

分析给出,结果自行解答。





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值