写出错误答案错误的原因
class Demo{
int show(int a,int b){return 0;}
}
下面那些函数可以存在于Demo的子类中。
A.public int show(int a,int b){return 0;}//可以,覆盖。
B.private int show(int a,int b){return 0;}//不可以,权限不够。
C.private int show(int a,long b){return 0;}//可以,和父类不是一个函数。没有覆盖,相当于重载。
D.public short show(int a,int b){return 0;}//不可以,因为该函数不可以和给定函数出现在同一类中,或者子父类中。
E.static int show(int a,int b){return 0;}//不可以,静态只能覆盖静态。
写出程序结果
class Super { public int get() { return 4; } } class Demo15 extends Super { public long get() { return 5; } public static void main(String[] args) { Super s = new Demo15(); System.out.println(s.get()); } } |
编译失败,因为子类父类中的get方法没有覆盖。但是子类调用时候不能明确返回的值是什么类型。
所以这样的函数不可以存在子父类中。
按要求实现下列问题:实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty和Staff。具体要求如下:
- Person类中的属性有:姓名name(String类型),地址address(String类型),
电话号码telphone(String类型)和电子邮件地址email(String类型);
- Employee类中的属性有:办公室office(String类型),工资wage(double
类型),受雇日期hiredate(String类型);
- Faculty类中的属性有:学位degree(String类型),级别level(String类型);
- Staff类中的属性有:职务称号duty(String类型)。
- 现有对象Person p1 =new Faculty()和Person p2 =new Staff (),请分别为p1的属性赋值“本科”和Staff类的duty赋值“职员”
答:
class Person{
String name;
String address;
String telphone;
String email;
}
class Employee extends Person{
String office;
double wage;
String hiredate;
}
class Faculty extends Employee{
String degree;
String level;
}
class Staff extends Employee{
String duty;
}
Person p1 = new Faculty();
Person p2 = new Staff();
//向下转型
if(p1 instanceof Faculty){
Faculty f1 = (Faculty)p1;
f1.degree = "本科";
}
if(p2 instanceof Staff){
Staff s1 = (Staff)p2;
s1.duty = "职员";
}
Object类的使用说明
我比较两个String总是false,但是它们明明都是"abc" !
答:比较String一定要使用equals或equalsIgnoreCase方法,不要使用 ==
==比较的是两个引用(变量)是否指向了同一个对象,而不是比较其内容。
为什么要重写toString()方法?
toString()方法在Object类中定义,其返回值是String类型,返回类名和它 的引用地址。
重写是介绍当前对象的属性
为什么要重写equals()方法?
答:
因为equals只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
重写:当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都 相等
定义一个person类,属性如下:
(1)身份证号,性别,姓名,年龄,户籍,出生日期(Data类型,需要引用java.uitl.Data)功能:
(2)自我介绍:介绍格式:(toString)
身份证号+姓名+户籍
(3)提供对象比较equals方法,只要身份证号+姓名相同就认为对象相等
答:
class Person{
public Person(String idNumber, String name, String koseki) {
this.idNumber = idNumber;
this.name = name;
this.koseki = koseki;
}
String idNumber;
String name;
int age;
String koseki;
Date dateOfBirth;
@Override
public String toString() {
return "Person{" +
"koseki='" + koseki + '\'' +
'}';
}
public boolean equals(Object o){
if(this == o){
return true;
}
if(o instanceof Person){
Person p = (Person)o;
return this.idNumber == p.idNumber && this.name == p.name;
}
return false;
}
}
写出“==”和equals的区别
答:
1.==即可以比较基本数据类型,也可以比较引用数据类型,对于基本数据类型比较的是具体的值,对于引用数据类型,比较的是地址值
2.equals是java.lang.Object类里面的方法,该方法没有被重写的情况下也是==,我们看到String等类都是对equals方法重写的
3.通常情况下,重写equals方法都是比较具体的属性是否想等。
请写出java基本数据类型及对应的封装类型,并说明封装类的作用。
答:
Byte Short Integer Long Float Double Boolean Character
包装类的作用就是将基本数据类型转换成引用类型(装箱),将引用类型数据转换成基本数据类型(拆箱)。
以下代码的运行结果是:
public static void main(String[] args) { Integer i1 = 128; Integer i2 = 128; int i3 = 128; int i4 = 128; System.out.println(i1 == i2); System.out.println(i3 == i4); System.out.println(i1 == i3); } | |
答案: false true true | Integer的i1和i2是对象,他们==比较的是地址。如果-128~127范围,那么使用缓存的常量对象,如果超过这个范围,是新new的对象,不是常量对象 |
每日一练
1. 循环结构是如何最后退出循环的,有哪些不同的情况请说明。
1循环条件部分为boolean类型表达式,当值为fals,退出循环。
2注意不要忘记声明迭代部分,否则,循环将不能结束,变成死循环
2.指出如下程序输出的结果:
label: for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 10; j++) { if (j % 4 == 0) { continue label; } System.out.print(j); } System.out.println(); } |
正确结果:1231231231230
3.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程 找出1000以内的所有完数。(因子:除去这个数本身的其它约数)
for(int i = 1;i <= 1000;i++){
int sum = 0;
for(int j = 1;j < i;j++){
if(i%j == 0){
sum+=j;
}
}
if(sum == i){
System.out.println(sum);
sum = 0;
}
}
4. 说明break和continue使用上的相同点和不同点
break语句用于终止某个语句块的执行
continue只能使用在循环结构中
continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
5. 从控制台输出如下结构:
******
*****
****
***
**
*
int size = 6;
int start = size;
int end = 1;
for(int i = 0;i < 6;i++){
for(int j = size;j>=1;j--){
if(j <= start && j>= end){
System.out.print("*");
}else {
System.out.print(" ");
}
}
end++;
System.out.println();
}