定义类A 和类B 如下:
class A {
int a = 1;
double d = 2.0;
void show() {
System.out.println("Class A: a=" + a + "\td=" + d);
}
}
class B extends A {
float a = 3.0f;
String d = "Java program.";
void show() {
super.show();
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
(1) 若在应用程序的main 方法中有以下语句:
A a=new A();//
a.show();//父类方法show
则输出的结果如何?
(2) 若在应用程序的main 方法中定义类B 的对象b:
A b=new B();//多态;父类引用指向子类的对象
b.show();//首先调用父类的show,再调用子类的show方法
结果:Class A: a=1 d=2.0
Class B: a=3.0 d="Java program."
因为a,多态中虽然不可以访问子类中父类没有的属性,直接访问相同属性的话,得到的结果是父类中的,但是可以通过方法中来访问子类中父类没有的的属性
5.写出错误答案错误的原因
class Demo{
int show(int a,int b){return 0;}//返回值类型为缺省,所以重写方法的返回值类型只能为缺省或者public
}
下面那些函数可以存在于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;}//不可以,静态只能覆盖静态。
6.写出程序结果
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());
}
}
//编译失败,因为int和long没有覆盖,所以子类中起始存在两个get方法,调用时不知道调用哪个,所以编译会失败
7.按要求实现下列问题:实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty和Staff。具体要求如下:
1)Person类中的属性有:姓名name(String类型),地址address(String类型),
电话号码telphone(String类型)和电子邮件地址email(String类型);
2)Employee类中的属性有:办公室office(String类型),工资wage(double
类型),受雇日期hiredate(String类型);
3)Faculty类中的属性有:学位degree(String类型),级别level(String类型);
4)Staff类中的属性有:职务称号duty(String类型)。
5)现有对象Person p1 =new Faculty()和Person p2 =new Staff (),请分别为p1的属性赋值“本科”和Staff类的duty赋值“职员”
package classTest4;
import java.security.PrivateKey;
/**
* describe:
*
* @author suoliang
* @create 2021-06-11:39
*/
public class use2 {
public static void main(String[] args) {
Person p1 = new Facutly();
Person p2 = new Staff();
if (p1 instanceof Facutly){
Facutly p11 = (Facutly) p1;
p11.setDegree("本科");
System.out.println(p11.getDegree());
}
if (p2 instanceof Staff){
Staff p22 = (Staff)p2;
p22.setDuty("支援");
System.out.println(p22.getDuty());
}
}
}
class Person{
private String name;
private String address;
private String telphone;
private String email;
}
class Employee extends Person{
private String office;
private double wage;
private String hiredate;
}
class Facutly extends Employee{
private String degree;
private String level;
public String getDegree() {
return degree;
}
public String getLevel() {
return level;
}
public void setDegree(String degree) {
this.degree = degree;
}
public void setLevel(String level) {
this.level = level;
}
}
class Staff extends Employee{
private String duty;
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
}
8.object类的使用说明
8.1我比较两个String总是false,但是它们明明都是"abc" !
因为如果使用==号比较的话,比较的是地址;
一定要使用equals,因为字符串中重写了equals,所以只会比较字面结果
8.2为什么要重写toString()方法?
不重写的话,tostring输出的是类名和地址值
8.3为什么要重写equals()方法?
不重写的话默认比较的是地址值
8.4定义一个person类,属性如下:
(1)身份证号,性别,姓名,年龄,户籍,出生日期(Data类型,需要引用java.uitl.Data)功能:
(2)自我介绍:介绍格式:(toString)
身份证号+姓名+户籍
(3)提供对象比较equals方法,只要身份证号+姓名相同就认为对象相等
package classTest4;
import java.util.Date;
/**
* describe:
*
* @author suoliang
* @create 2021-06-11:50
*/
public class use3 {
}
class Person1{
private String name;
private int id;
private int age;
private String place;
private Date date;
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", id=" + id +
", place='" + place + '\'' +
'}';
}
public boolean equals(Object o){
if (o == this){return true;}
if (o == null || o.getClass() != this.getClass()){
return false;
}
Person1 o1 = (Person1) o;
return this.id == o1.id && this.name == o1.name;
}
}
public static void main(String[] args) {
double a = 2.0;
double b = 2.0;
Double c = 2.0;
Double d = 2.0;
System.out.println(a == b);true基本数据类型比较值
System.out.println(c == d);false:引用数据类型比较地址
System.out.println(a == d);true基本数据和引用类型比较,比较值
}
super关键字:找父类中的
class Test {
Test() {
System.out.println("Test");
}
}
class Demo extends Test {
Demo() {
// super();默认会调用父类无参构造器
System.out.println("Demo");
}
public static void main(String[] args) {
new Demo();//Test
new Test();//Test Demo
}
}
class Super {
int i = 0;
public Super(String a) {
System.out.println("A");
i = 1;
}
public Super() {
System.out.println("B");
i += 2;
}
}
class Demo extends Super {
public Demo(String a) {
// super();
System.out.println("C");
i = 5;
}
public static void main(String[] args) {
int i = 4;
Super d = new Demo("A");
System.out.println(d.i);//B C 5
}
}
class Super {
int i = 0;
public Super(String s) {
i = 1;
}
}
class Demo extends Super {
public Demo(String s) {
i = 2;
}
public static void main(String[] args) {
Demo d = new Demo("yes");
System.out.println(d.i);
}
编译失败,父类没有无参构造器
}
package test;
public class FatherClass{
public FatherClass(){
System.out.println("FatherClass Create");
}
}
子类:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass{
public ChildClass(){
System.out.println("ChildClass Create");
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
public class Test {
public static void main(String[] args) {
Base b1 = new Base();
Base b2 = new Sub();
}
}
class Base{
Base(){
method(100);
}
public void method(int i){
System.out.println("base : " + i);
}
}
class Sub extends Base{
Sub(){
super.method(70);
}
public void method(int j){
System.out.println("sub : " + j);
}
}
base : 100
sub : 100
base : 70
class A {
private int a;
public void setA(int a) {
this.a = a;
}
public int getA() {
return a;
}
}
class B extends A {
private int a;
public void setA(int a) {
this.a = a;
}
// public int getA(){
// return a;
// }有了get方法以后得到的是5
}
public class PersonTest {
public static void main(String[] args) {
A c = new B();
c.setA(5);//set的是B里面的5;
System.out.println(c.getA());//输出的是A里面的0,因为子类中没有get方法
}
}
class Fu {
boolean show(char a) {
System.out.println(a);
return true;
}
}
class Demo extends Fu {
public static void main(String[] args) {
int i = 0;
Fu f = new Demo();
Demo d = new Demo();
for (f.show('A'); f.show('B') && (i < 2); f.show('C')) {
i++;
d.show('D');
}
}
boolean show(char a) {
System.out.println(a);
return false;
}
}//return 再for循环里可以用来终止循环,
class Fu {
int num = 4;
void show() {System.out.println("showFu");}}
class Zi extends Fu {
int num = 5;
void show() {
System.out.println("showZi");
}}
class T {
public static void main(String[] args) {
Fu f = new Zi();
Zi z = new Zi();
System.out.println(f.num);//5
System.out.println(z.num);//5
f.show();//showZi
z.show();//showZi
}
}
package classTest4;
/**
* describe:
*
* @author suoliang
* @create 2021-06-13:01
*/
public class use12 {
public static void main(String[] args) {
Per per = new stu();
per.show();//这里面的a和d是子类中的
System.out.println(per.a);//直接访问a和d是父类中的,不可以访问子类中的
System.out.println(per.d);
}
}
class Per{
int a = 12;
double d = 20.0;
public void show(){
System.out.println(a+d);
}
}
class stu extends Per{
int a = 20;
String d = "爱我中华";
@Override
public void show() {
System.out.println(a + d);
}
}