Java面向对象程序设计第5章1-9

1.面向对象的主要特征是什么?

三大特征是:封装、继承和多态
封装:是指将某事物的属性和行为包装到对象中,这个对象只对外公布须要公开的属性和行为,而这个公布也是能够有选择性的公布给其它对象。
继承:是子对象能够继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。
多态性:是指容许不一样类的对象对同一消息做出响应。多态性语言具备灵活、抽象、行为共享、代码共享的优点,很好的解决了应用程序函数同名问题。java

2.封装是如何实现的?

封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。
java封装类经过三个步骤实现:安全

  1. 修改属性的可见性,限制访问。
  2. 设置属性的读取方法。
  3. 在读取属性的方法中,添加对属性读取的限制。

3.对象之间如何相互做用?做用的条件是什么?

经过封装与组合来设计,具备“高内聚,低耦合”的特色。好比A类里有B类的引用,则A的实例对象就能够当作B的实例对象组合而成。函数

4.protected修饰符有何特色?

protected这个修饰符,各大参考书都会这样说:访问权限为类内,包内和子类,所以在父类中定义的方法和成员变量若是为protected修饰的,同包中任意访问,只有父类声明为public时不一样包的子类也能够访问。this

5.Object都有哪些方法?

Object类的函数

1.Object clone()

将当前对象克隆,保护方法,实现对象的浅复制,只有实现了Cloneable接口才能够调用该方法,不然抛出CloneNotSupportedException异常。线程

主要是JAVA里除了8种基本类型传参数是值传递,其余的类对象传参数都是引用传递,咱们有时候不但愿在方法里讲参数改变,这是就须要在类中复写clone方法。设计

2.Class getClass()

得到当前的类对象code

3.String toString()

获得表明这个对象的字符串,通常子类都有覆盖。对象

4.void finalize()

对象被释放时使用,由于没法肯定该方法何时被调用,不多使用。blog

5.Boolean equals()

判断两个引用是否指向同一个对象,其参数不能为普通数据类型继承

6.int hashCode()

获得表明对象的一个整数,这个整数在应用程序运行时保持不变

7.void wait()

应用于线程同步中的线程等待

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具备该对象的锁。wait()方法一直等待,直到得到锁或者被中断。wait(long timeout)设定一个超时间隔,若是在规定时间内没有得到锁就返回。
调用该方法后当前线程进入睡眠状态,直到如下事件发生。

  1. 其余线程调用了该对象的notify方法。

  2. 其余线程调用了该对象的notifyAll方法。

  3. 其余线程调用了interrupt中断该线程。

  4. 时间间隔到了。

    此时该线程就能够被调度了,若是是被中断的话就抛出一个InterruptedException异常。

8.notify

用于线程同步中唤醒等待的线程

9.notifyAll

用于线程同步中唤醒等待的全部线程

6.重载的方法之间通常有什么关系?

方法名称相同,参数类型或个数不一样,能够当作重载的方法是一个方法的两种实现,仅有返回类型不一样,则编译不能经过

7.子类覆盖父类方法须要什么条件?子类中定义与父类同名的方法必定是覆盖吗?

条件:

  1. 子类的访问修饰符权限应等于或大于父类
  2. 同名的static方法和非static方法不能相互覆盖
  3. 方法前有final修饰符,此方法不能在子类方法中进行覆盖
  4. 在JDK中,不少父类的方法被子类从新覆盖,赋予了不一样的含义,如Object类中的boolean equals(Object obj)方法
  5. 抽象类中若是存在抽象方法,则具体子类必须对抽象方法进行覆盖

不必定:

子类和父类的方法必须是实例方法,若是父类是static方法而子类不是实例方法,或者相反都会报错。
若是父类和子类都是static方法,那么子类重写或者覆盖父类方法。

8.封装、继承与多态在面向对象程序设计中的用途是什么?

封装使得内部实现对用户隐藏,有利于安全操做,继承能够实现对象之间的共性与特性,多态性更贴近人的使用习惯,使程序更方便。

9.设计Src和Dis两个类,Src中有一个被封装的属性,类型为int(要求为非负值),每当经过特定方法更改Src对象中的这个属性后,Dis对象都能获得通知,并向Src发消息得到此属性值。

class Dis {
    int val;
    public  Dis(int con_val){
       val = con_val;
    }
    public void monitor() {
        System.out.println("the value of Src has changed");
    }
}

class Src{
    Dis dis;//组合dis
    int value;

    public Src(Dis con_dis) {
        value = con_dis.val >= 0 ? con_dis.val : 0;//保证value非负
        this.dis=con_dis;//Src对象中拥有了Dis对象的引用
    }
    public void valueChange() {
        for (int i = 0; i < 2; i++) {
            int oldvalue = value;
            value += i;
            if (oldvalue != value){
                dis.monitor();//只改变了一次
            }
        }
    }
}

public class test {
    public static void main(String[] args) {
        Dis dis=new Dis(666);
        Src src=new Src(dis);//建立src对象,并将src对象做为参数传入
        src.valueChange();//the value of Src has changed
    }
}

结尾:

之后有补充再来改~~~

相关文章
相关标签/搜索