阶段题目

 

Practices

随着类的加载而加载;早于对象的创建;
只要权限允许,可以通过”对象.static属性”的方式进行调用;
存在于方法区的静态域
1. static 修饰的属性,相较于实例变量,有哪些特别之处(>=3点)

 

修饰类  最终类不可以被继承
修饰方法: 此方法不可以被重写
修饰变量: 此变量变为一个常量不可以改变其赋值
2. final 可以用来修饰哪些结构,分别表示什么意思

 

class AprilTwentyThreePerson{
    private AprilTwentyThreePerson(){};

    private  static AprilTwentyThreePerson person = new AprilTwentyThreePerson();
    
    public static AprilTwentyThreePerson getPerson(){
        return person;
    }
}
3. 代码实现单例模式的饿汉式

 

class AprilTwentyThreePerson{
    private AprilTwentyThreePerson(){};
    
    private static AprilTwentyThreePerson person = null;
    
    public static AprilTwentyThreePerson getPerson(){
        if(person == null){
            person = new AprilTwentyThreePerson();
        }
        return person
    }
}
4. 代码实现单例模式的懒汉式 -目前还是线程不安全的。

 

默认初始化
显式初始化 、代码块中初始化
构造器中初始化
通过”对象.属性” 或”对象.方法”的方式赋值
5. 类的属性赋值的位置有哪些?先后顺序为何?

 

 

 

 

1: java类是否可以多继承,怎么实现多继承?

 

java没有多继承,但是可以通过接口的形式来达到多继承的目的

interface A
{
  public void doA()
}
interface B
{
  public void doB()
}
....
....
class c implements A,B
{
  public void doA()
  {......
  }
  public void doB()
  {
   .....
   }
  ....
} 
View Code

 

 

2:定义类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();


则输出的结果如何?


(2) 若在应用程序的main 方法中定义类B 的对象b


A b=new B();


b.show();


则输出的结果如何?

 

 

 

答:输出结果为:
1)Class A: a=1 d=2.0 
2)Class A: a=1 d=2.0
Class B: a=3.0 d=Java program。
View Code

 

3 写出重载与重写的区别。重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

 

答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
View Code

 

 

4:Overload的方法是否可以改变返回值的类型?

 

Overloaded的方法是可以改变返回值的类型
View Code

 

 

5: 写出错误答案 错误原因

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;}//不可以,静态只能覆盖静态。

 

 

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());
    }

结果:

编译失败,因为子类父类中的get方法没有覆盖。但是子类调用时候不能明确返回的值是什么类型。
所以这样的函数不可以存在子父类中。
View Code

 

7: 按要求实现下列问题:实现一个名为Person的类和它的子类EmployeeEmployee有两个子类FacultyStaff。具体要求如下:

 

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赋值“职员”

 

解答:

public class personTest {
    public static void main(String[] args) {
        Pp p1 = new Faculty();  //多态
        Pp p2 = new Staff();
        ((Faculty) p1).setLevel("本科");
        ((Staff)p2).setDuty("职员");

    }

}

class Pp {
    private  String name;
    private  String address;
    private  String telphone;
    private  String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTelphone() {
        return telphone;
    }

    public void setTelphone(String telphone) {
        this.telphone = telphone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}



class Empl extends  Pp {
    private  String offer;
    private  String wage;
    private  String hiredate;

    public String getOffer() {
        return offer;
    }

    public void setOffer(String offer) {
        this.offer = offer;
    }

    public String getWage() {
        return wage;
    }

    public void setWage(String wage) {
        this.wage = wage;
    }

    public String getHiredate() {
        return hiredate;
    }

    public void setHiredate(String hiredate) {
        this.hiredate = hiredate;
    }
}


class Faculty extends  Empl{
    private  String degree;
    private  String level;

    public String getDegree() {
        return degree;
    }

    public void setDegree(String degree) {
        this.degree = degree;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}


class Staff extends  Empl{
    private  String duty;

    public String getDuty() {
        return duty;
    }

    public void setDuty(String duty) {
        this.duty = duty;
    }
}
View Code

 

 

 

 

 

Object类的使用说明

1:

我比较两个String总是false,但是它们明明都是"abc" 

 

答:

答:比较String一定要使用equals或equalsIgnoreCase方法,不要使用 ==  
  ==比较的是两个引用(变量)是否指向了同一个对象,而不是比较其内容。

 

为什么重写toString()方法;

因为在System.out.println(类的对象名)时,类的对象名是个引用,如果不重写,就输出引用地址。

其实实际是这样的System.out.println(类的对象名.toString()),只是我们平时默认不用写,它自动加上。

 

为什么重写equals()

判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象。这样我们往往需要重写equals()方法。

因为默认equals在比较两个对象时,是看他们是否指向同一个地址的。但有时,我们需要两个不同对象只要是某些属性相同就认为它们equals()的结果为true

 

两个对象a和b,请问a==b和a.equals(b)有什么区别?

 

则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。 

 

 

下面代码如何优化

if(username.equals(“admin”){
  ....
}

 

解答:

因为前面没有判断为空所以先把具体的不为空的放前面
答案:
if(“admin”.equals(username)){
}

 

 

创建一个汽车类(Car

 

(1)为其定义两个属性:颜色和型号。每个属性都使用private进行封装,为每个属性设置set、get方法。
(2)为该类创建两个构造方法。第一个为无参的构造方法。第二个为带参构造方法
(3)重写toString方法,通过toString输出汽车信息。
(4)重写equals方法,如果汽车的颜色和型号相同就认为是同一辆车。
(5)实例化两个对象,输出两个对象的信息,比较两个对象是否是同一个对象。

 

 

 

 

1:
编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。
(1)每个类都有构造方法进行属性初识化
(2)每个类都输出相关数据的toString方法
(3)使用Test类中的main方法定义各类初始化数据后台打印相关数据




2:
定义员工类Employee,包含姓名、工号和工资,包含计算奖金方法bonus,普通员工和经理都是员工,计算奖金的方法为工资*奖金系数,普通员工的奖金系数为1.5(常量),经理为2(常量),分别实现bonus方法,创建对象测试。

定义一个交通工具类,并定义抽象方法,说明交通工具可以移动。继承交通工具而产生汽车、飞机、轮船类,并实现其移动方法。


3:
equals()编程1:
(1)编写一个人类Person,其中包含姓名、性别和年龄的属性,包含构造方法以及显示姓名、性别和年龄的方法。(10分)
(2)再编写一个学生类Student,它继承Person类,其中包含学号属性,包含构造方法以及显示学号的方法。(10分)
(3)在Student类里面重写equals方法,只要是学号和姓名一致就认为是同一个学生。(20分)
(4)最后编写一个测试类,此类里面包含main()方法,在main()方法中定义两个学生s1和s2并给他们赋值,最后显示他们的学号、姓名、性别以及年龄,以及判断两个学生是否是同一个学生。(10分)

 

 

 

.

posted @ 2019-10-11 14:49  可爱的红领巾  阅读(524)  评论(0)    收藏  举报