一、掌握方法重载(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函数
八、可变参数
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);
}
}
}
|