1. 面向对象的主要特征是什么?
三大特征是: 封装, 继承和多态.
封装: 是指将某事物的属性和行为包装到对象中, 这个对象只对外公布需要公开的属性和行为, 而这个公布也是可以有选择性的公布给其它对象.
继承: 是子对象可以继承父对象的属性和行为, 亦即父对象拥有的属性和行为, 其子对象也就拥有了这些属性和行为.
多态性: 是指允许不同类的对象对同一消息作出响应. 多态性语言具有灵活, 抽象, 行为共享, 代码共享的优势, 很好的解决了应用程序函数同名问题.
2. 封装是如何实现的?
封装是将对象的信息隐藏在对象内部, 禁止外部程序直接访问对象内部的属性和方法.
java 封装类通过三个步骤实现:
修改属性的可见性, 限制访问.
设置属性的读取方法.
在读取属性的方法中, 添加对属性读取的限制.
3. 对象之间如何相互作用? 作用的条件是什么?
通过封装与组合来设计, 具有 "高内聚, 低耦合" 的特点. 比如 A 类里有 B 类的引用, 则 A 的实例对象就可以看成 B 的实例对象组合而成.
4.protected 修饰符有何特点?
protected 这个修饰符, 各大参考书都会这样说: 访问权限为类内, 包内和子类, 因此在父类中定义的方法和成员变量如果为 protected 修饰的, 同包中任意访问, 只有父类声明为 public 时不同包的子类也可以访问.
5.Object 都有哪些方法?
1.Object clone()
将当前对象克隆, 保护方法, 实现对象的浅复制, 只有实现了 Cloneable 接口才可以调用该方法, 否则抛出 CloneNotSupportedException 异常.
主要是 JAVA 里除了 8 种基本类型传参数是值传递, 其他的类对象传参数都是引用传递, 我们有时候不希望在方法里讲参数改变, 这是就需要在类中复写 clone 方法.
2.Class getClass()
获得当前的类对象
3.String toString()
得到代表这个对象的字符串, 一般子类都有覆盖.
4.void finalize()
对象被释放时使用, 因为无法确定该方法什么时候被调用, 很少使用.
5.Boolean equals()
判断两个引用是否指向同一个对象, 其参数不能为普通数据类型
6.int hashCode()
得到代表对象的一个整数, 这个整数在应用程序运行时保持不变
7.void wait()
应用于线程同步中的线程等待
wait 方法就是使当前线程等待该对象的锁, 当前线程必须是该对象的拥有者, 也就是具有该对象的锁. wait() 方法一直等待, 直到获得锁或者被中断. wait(long timeout) 设定一个超时间隔, 如果在规定时间内没有获得锁就返回.
调用该方法后当前线程进入睡眠状态, 直到以下事件发生.
其他线程调用了该对象的 notify 方法.
其他线程调用了该对象的 notifyAll 方法.
其他线程调用了 interrupt 中断该线程.
时间间隔到了.
此时该线程就可以被调度了, 如果是被中断的话就抛出一个 InterruptedException 异常.
8.notify
用于线程同步中唤醒等待的线程
9.notifyAll
用于线程同步中唤醒等待的所有线程
6. 重载的方法之间一般有什么关系?
方法名称相同, 参数类型或个数不同, 可以看成重载的方法是一个方法的两种实现, 仅有返回类型不同, 则编译不能通过
7. 子类覆盖父类方法需要什么条件? 子类中定义与父类同名的方法一定是覆盖吗?
条件:
子类的访问修饰符权限应等于或大于父类
同名的 static 方法和非 static 方法不能相互覆盖
方法前有 final 修饰符, 此方法不能在子类方法中进行覆盖
在 JDK 中, 很多父类的方法被子类重新覆盖, 赋予了不同的含义, 如 Object 类中的 boolean equals(Object obj) 方法
抽象类中如果存在抽象方法, 则具体子类必须对抽象方法进行覆盖
不一定:
子类和父类的方法必须是实例方法, 如果父类是 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
- }
- }
结尾:
以后有补充再来改~~~
来源: https://www.cnblogs.com/He-Fan/p/11575976.html