嵌入式软件开发培训笔记——Java第三天(方法重载、对象的构造与初始化过程分析、封装等)

一、掌握方法重载(Overload)
    同一个类中方法名相同时,称为方法的重载(Overload)
    特点:1、参数列表不同
                    1)参数类型不同
                    2)参数的个数不同
              2、不考察返回值类型
    例:
    package reload;
    public class Reload {
     public static void main(String[] args) {
 
          Reload test = new Reload();
          int x = test.add(22, 15);
          int y = test.add(22,11,33);
          float z = test.add(2.5f, 6.5f);
 
          System.out.println(x);
          System.out.println(y);
          System.out.println(z);
     }
 
         public static int add(int a, int b){
              return a + b;
         }
 
         public static int add(int a, int b, int c){
              return a + b + c;
         }
 
         public static float add(float a, float b){
              return a + b;
         }
    }

    构造器的重载
    
二、this关键字
    指本类对象的引用
    (1、构造器中指该构造器所创建的新对象    2、方法中指调用该方法的对象)
    用法:
    1、在类本身的方法或构造器中引用该类的实例变量和方法
    2、将当前对象作为参数传递给其它方法或构造器
    3、用来调用其他的重载的构造器

三、对象的构造和初始化过程分析
    内在分配,缺省的初始化进行
    实例变量的初始化如下递归的进行:
    1、设置实例变量的值为缺省的初始值
    2、调用对象的构造器,绑定构造器参数
    3、如果构造器中有this()调用,则根据this()调用的参数调用相应的重载构造器,然后,转到步骤5;否则转到步骤4.
    4、除java.lang.Object类外,调用父类中的初始化块初始化父类的属性,然后调用父类构造器,如果在构造器中有super()调用,则根据super()中的参数调用父类中相应的构造器。
    5、使用初始化程序和初始化块初始化成员。
    6、执行构造器方法体中其他语句。

    初始化块
    它指的是类中中的“游离块”——不属于变量声明、不属于方法、不属于构造器,但需要用{}单独括起来。
    不管使用哪个构造器创建对象,它都会被首先运行,然后才是构造器的主体部分被告执行。
    初始化代码块:直接在类中定义,使用期{}括起来的语句。在构建对象时首先执行,它要先于当前类的构造器执行。
    执行步骤:1、父类的初始化块    2、父类的构造器    3、子类的初始化块    4、子类的构造器
    注:以上四个步骤不是线性执行,它们之间具有调用关系。
    例:
    
person.java
teacher.java
test.java
package person_teacher;
public class person {
 String name;
 String sex;
 int age;
 
 public person(){
  System.out.println("构造器person()被调用");
 }
 
 public person(String theName){
  System.out.println("构造器person(String theName)被调用");
  name = theName;
  System.out.println("name="+name+",age="+"age"+"sex="+sex);
 }
 
 public person(String theName, int theAge){
  System.out.println("构造器person(String theName, int theAge)被调用");
  name = theName;
  age = theAge;
  System.out.println("name="+name+",age="+"age"+"sex="+sex);
 }
 
 {
  name = "Tony Blair";
  age = 50;
  sex = "Female";
  System.out.println("\nperson初始化块执行后:name="+name+",age="+age+"sex="+sex);
 }
}
package person_teacher;
public class teacher extends person {
 String department;
 int schoolAge;
 
 teacher(){
  System.out.println("构造器teacher()被调用");
 }
 
 teacher(String name){
  super(name);
  System.out.println("构造器teacher(String name)被调用");
 }
 
 teacher(int theSchoolAge){
  schoolAge = theSchoolAge;
  System.out.println("构造器teacher(int theSchoolAge)被调用");
 }
 
 teacher(String theDepartment, int schoolAge){
  this(schoolAge);
  department = theDepartment;
  System.out.println("构造器teacher(String theDepartment, int schoolAge)被调用");
 }
 
 {
  department = "教务部";
  System.out.println("\nteacher初始化块执行后:name="+name+",age="+age+",sex="+sex);
 }
}
package person_teacher;
public class test {
 public static void main(String args[]){
  teacher t1 = new teacher();
  System.out.println("----------------------");
  teacher t2 = new teacher("Tom");
 }
}

四、封装类
问题:如何将字符串的“1234”转换成整数1234?如何将1234转换成十六进制?二进制?八进制?
以上问题需要使用封装类Integer的方法
API文档Integer类中public static int parseInt(String s);
示例1:字符串转整型,其他API也在Integer类中查找。
    package c1234;
    public class Test { 

     public static void main(String[] args) {
          String str = "1234";
          int x = Integer.parseInt(str);
          x++;
          System.out.println(x);
     }
    }

五、自动装箱/拆箱    (JDK5.0以后才有这个说法)(只限于封装类)
把基本的数据类型赋值给一个封装类的引用变量,称为自动装箱。
(Integer iObject = new Integer(100);Integer iObject = 100;)
指导一个引用变量赋值给简单数据类型变量,称为自动拆箱。
(int i = new Integer(100);)

示例1:
    package c1234;   
    public class Test {      
     public static void main(String[] args) {
          Integer i = new Integer(10);
          Integer j = new Integer(10);
          System.out.println(i == j);        // i与j分别指向的内存的地址
 
          Integer m = 100;
          Integer n = 100;
          System.out.println(m == n);    //m与n指向同一个内存
 
          Integer p = 200;
          Integer q = 200;
          System.out.println(p == q);    //值超出了赋值范围(-127~128),p、q各自重新new了一个对象
     }
    }
    结果分别为:false——true——false

六、==和equals()
示例1:

上例中Animal类结果都为false,是因为:
equals在object类中这个方法实现代码
    public boolean equals(Object obj){
        return (this == obj)
    }
就是说,这个方法在Object类中使用==实现的,它们是等价的。

而在String类中,程序运行的时候,由String类中的equals方法覆盖了Object中的equals方法,此时equals比较的是字符序列是否相等,==用来比较str1、str2是否指向同一个内存。 (面试常问题)
    equals方法在实际应用时可以自定义改写


七、toString()方法
是Object类中的方法
API文档Object类中public String toString();
返回值为:getClass().getName() + '@' + Integer.toHexString(hashCode())
                类名的完整引用+‘@’+  hashCode用来标识对象
示例1:“会调用其自身的toString函数

示例2:重写的方法原理与上例一样
 


八、可变参数
    1、方法的参数类型相同
    2、使用...来表示可变参数
    3、可变参数可以看作是一个数组对象
示例1:


九、新型的for循环用法
     这种for循环方式,可以应用于数组和集合的运算。相似于shell脚本的for循环。
    示例1:
    
    for x in (.........)
    do 
            ............
    done
    这种循环称为foreach方式,在C#中有这种关键字

作业:
1.已知1900年1月1日是星期一,从键盘中输出1900年以后的年、月、日,
 1)判断年月日的合法性
 2)并判断这一天是星期几
 3)并且打印出这个月份的月历,打印格式参见Windows操作系统。
mydate类 test类
public class Mydate {
 
 public int getDay(int year, int month, int day) {
  int daycount = 0;
  int leapflag = 0;
 
  if(year < 1900){
   return -1;
  }
 
  if((month < 1) || (month >12)) {
   return -1;
  }
 
  if(day < 1 || (day > 31)) {
   return -1;
  }
 
  for(int i = 1900; i < year; i++){
   if(((i%4 == 0) && (i%100 != 0)) ||(i % 400 == 0)) {
    daycount += 366;
   }else{
    daycount += 365;
   }
  }
 
  if(((year%4 == 0) && (year%100 != 0)) ||(year % 400 == 0)) {
   leapflag = 1;
   if((month == 2) && (day > 29)) {
    return -29;
   }
  }else{
   if((month == 2) && (day > 28)) {
    return -28;
   }
  }
 
  switch(month) {
   case 1: daycount += day;
     break;
   case 2: daycount += (day+31);
     break;
   case 3: if(leapflag == 1){
      daycount += (day + 60);
     }else{
      daycount += (day + 59);
     }
     break;
   case 4: if(leapflag == 1){
      daycount += (day + 91);
     }else{
      daycount += (day + 90);
     }
     break;
   case 5: if(leapflag == 1){
      daycount += (day + 121);
     }else{
      daycount += (day + 120);
     }
     break;
   case 6: if(leapflag == 1){
      daycount += (day + 152);
     }else{
      daycount += (day + 151);
     }
     break;
   case 7: if(leapflag == 1){
      daycount += (day + 182);
     }else{
      daycount += (day + 181);
     }
     break;
   case 8: if(leapflag == 1){
      daycount += (day + 213);
     }else{
      daycount += (day + 212);
     }
     break;
   case 9: if(leapflag == 1){
      daycount += (day + 243);
     }else{
      daycount += (day + 242);
     }
     break;
   case 10:if(leapflag == 1){
      daycount += (day + 274);
     }else{
      daycount += (day + 273);
     }
     break;
   case 11:if(leapflag == 1){
      daycount += (day + 304);
     }else{
      daycount += (day + 303);
     }
     break;
   case 12:if(leapflag == 1){
      daycount += (day + 335);
     }else{
      daycount += (day + 334);
     }
     break;
   default:break;
  }
  return daycount;
 }
 
 public void display_month(int year, int month, int fweek) {
  int leapflag = 0;
  int count = 0;
  System.out.println("周日\t周一\t周二\t周三\t周四\t周五\t周六");
 
  if(((year%4 == 0) && (year%100 != 0)) ||(year % 400 == 0)) {
   leapflag = 1;
  }
 
  if(month == 2) {
   if(leapflag == 1){
    for(int i = 1; i <= fweek; i++) {
     System.out.print("\t");
     count++;
    }
    for(int i = 1; i <= 29; i++) {
     System.out.print(i+"\t");
     count++;
     if(count % 7 == 0) {
      System.out.println();
     }
    }
   }else{
    for(int i = 1; i <= fweek; i++) {
     System.out.print("\t");
     count++;
    }
    for(int i = 1; i <= 28; i++) {
     System.out.print(i+"\t");
     count++;
     if(count % 7 == 0) {
      System.out.println();
     }
    }
   }
  }else if((month % 2 == 0) && (month != 2) && (month < 7)) {
   for(int i = 1; i <= fweek; i++) {
    System.out.print("\t");
    count++;
   }
   for(int i = 1; i <= 30; i++) {
    System.out.print(i+"\t");
    count++;
    if(count % 7 == 0) {
     System.out.println();
    }
   }
  }else if((month % 2 == 1) && ((month <= 7))) {
   for(int i = 1; i <= fweek; i++) {
    System.out.print("\t");
    count++;
   }
   for(int i = 1; i <= 31; i++) {
    System.out.print(i+"\t");
    count++;
    if(count % 7 == 0) {
     System.out.println();
    }
   }
  }else if((month > 7) && (month % 2 == 0)) {
   for(int i = 1; i <= fweek; i++) {
    System.out.print("\t");
    count++;
   }
   for(int i = 1; i <= 31; i++) {
    System.out.print(i+"\t");
    count++;
    if(count % 7 == 0) {
     System.out.println();
    }
   }
  }else if((month > 7) && (month % 2 == 1)) {
   for(int i = 1; i <= fweek; i++) {
    System.out.print("\t");
    count++;
   }
   for(int i = 1; i <= 30; i++) {
    System.out.print(i+"\t");
    count++;
    if(count % 7 == 0) {
     System.out.println();
    }
   }
  }
 }
}
import java.util.Scanner;
public class test {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int errorflag = 0;
  Scanner ymd = new Scanner(System.in);
  System.out.println("请输入年份:");
  int year = ymd.nextInt();
  System.out.println("请输入月份:");
  int month = ymd.nextInt();
  System.out.println("请输入日期:");
  int date = ymd.nextInt();
   
  Mydate dd = new Mydate();
  int countday = dd.getDay(year, month, date);
  if(countday == -1) {
   System.out.println("输入日期格式错误!");
   errorflag = 1;
  }else if(countday <= -28) {
   System.out.println("该月没有"+date+"日");
   errorflag = 1;
  }else{
   System.out.println("距1900年1月1日,总天数共"+countday+"天");
  }
   
  int weekflag = countday % 7;
  switch(weekflag) {
   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;
   case 6: System.out.println("星期六");
      break;
   case 7: System.out.println("星期日");
      break;
   default: break;
  }
 
  if(errorflag == 0) {
   countday = dd.getDay(year, month, 1);
   weekflag = countday % 7;
   
   dd.display_month(year, month, weekflag);
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值