java N 问

如何理解面向对象?

编程中有面向对象和面向过程两种思想。它们都是从编程实践中总结出来的

面向对象就是把实际问题抽象成不同的实体(类),在实体中封装对象的属性和方法,来方便地解决问题。

以飞机大战游戏为例。若想实现这样的功能,该如何用java OOP来设计思路?先抽象这个游戏中的实体:敌人飞机、英雄飞机、蜜蜂、子弹。所有的事物都要飞行、移动;不同的飞行实体又有各自的特点。所以我们抽象一个父类FlyingObject,飞机、蜜蜂等继承这个类再扩展自己的属性和方法。最后再在一个主类中实现、组织游戏逻辑。

对于简单的问题容易抽象实现OOP,而复杂的问题体现了一个人的设计和抽象能力。OOP比较适合解决复杂的问题

参考:《core java 一》..P91、《Go语言编程》..P62

如何理解java中的封装、继承和多态?

封装
  1. 封装类的属性和方法
  2. 封装常用的操作,实现重用和移植
  3. ArrayList
  4. Map
  5. Set
  6. java util包
继承

继承体现了A is B的抽象关系。越抽象的类处在继承链的顶端。在代码设计上要能找到一般、抽象的实体,简化代码和逻辑。

多态

多态的3个必要条件 - 继承 - 方法重写 - 父类引用指向子类对象

动态绑定(dynamic binding):是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

  • 类的多态 父类可以引用不同的子类。子类可以强制转换成父类。父类不能转换成子类

  • 方法的多态 相同的方法名,根据方法签名确定要调用的方法。

example
package com.tank.test;

public class Test {  
    public static void main(String[] args) {
        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();   
        System.out.println(a1.show(b)); 
        System.out.println(a1.show(c));   
        System.out.println(a1.show(d));   
        System.out.println(a2.show(b));   
        System.out.println(a2.show(c));   
        System.out.println(a2.show(d));   
        System.out.println(b.show(b));     
        System.out.println(b.show(c));     
        System.out.println(b.show(d)); 
    }
}

class A{  
    public String show(D obj){  
        return ("A and D");  
 }   

 public String show(A obj){  
        return ("A and A");  
 }  
}

class B extends A{  
    public String show(B obj){  
           return ("B and B");  
    }  
    public String show(A obj){  
           return ("B and A");  
    }   
}

class C extends B{}  
class D extends B{}  

输出:

A and A  
A and A  
A and D  
B and A  
B and A  
A and D  
B and B  
B and B  
A and D  

overload&overwrite

overload(重载)

根据方法签名来实现调用相同方法名的不同方法

overwrite

方法重写,子类继承父类重写父类的方法。 要求:方法名和参数名要相同

抽象类和接口的区别

抽象类描述的是本质,”是什么“;接口描述的是方法,”具有什么功能“。

抽象类中可以定义普通方法和抽象方法,但是必须是事物本质上所具有的方法,接口描述的是”具备什么功能“,可以定义公有静态常量。

抽象类但继承,接口可以多实现

抽象类和接口都不能实例化,但是变量可以引用具体化的子类对象。

参考连接

值传递可引用传递

java传递的都是副本
值传递:传递值的副本 引用传递:传递引用(地址)的副本

标识符为什么不能以数字开头?

int 1 =1?  如何理解?  

GC情况下会发生内存泄露吗

会的

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:

这些对象是可达的,即在有向图中,存在通路可以与其相连 其次,这些对象是无用的,即程序以后不会再使用这些对象。 如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

Vector v=new Vector(10);  
for (int i=1;i<100; i++)  
{
    Object o=new Object();
    v.add(o);
    o=null; 
}

参考连接

”与”equals”的区别

“”比较两个变量是否具有相同的引用。

“equals”用于比较两个对象是否相等。由于java有多态的特性,所以这个方法稍微复杂。它在Object超类中就定义了。要根据具体的需求来修改: 对于this.equals(Object otherObj)

  1. this otherObj
  2. otherObj != null
  3. 比较this和otherObj是否属于同一个类
    3.1 如果equals语义在每个子类中有所改变。if(getClass()otherObj.getClass())
    3.2 如果子类中有统一的语义。if(otherObj instanceof ClassName)
  4. other = (ClassName) otherObj
  5. fieldn == otherObj.fieldn && Objects.equals(fieldn, other.fieldn) && ..

如何理解Java中的this

public class Test{  
    private String a;
    private int b;

    public Test(int b){
    this.b = b;
    }

    public void testAdd(int num){
        System.out.println(b+num);
        System.out.println(this.b+num);
    }

    public static void main(String args[]){
        Test t = new Test(8);
        t.testAdd(8);
    }
}

指代隐式参数(类的实例)

说说你眼中的java序列化(Serilizable)

java程序运行在内存中,程序停止运行java中的对象就没有了。
为了将对象信息保存下来,可以将对象保存在文件中,或者是数据库中(持久化)。 要想序列化对象,类必须实现Serilizable接口。

super

调用超类方法