面试-面向对象

一:构造函数和一般函数区别:

1.
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。
2.
构造函数:对象创建时,会调用只调用一次。
一般函数:对象创建后,可以被调用多次。

3.细节:
1,构造函数如果完成了set功能。set方法是否需要。
2,一般函数不能直接调用构造函数。
3,构造函数如果前面加了void就变成了一般函数。
4,构造函数中是有return语句的。


二:代码块。

1,局部代码快。方法内 {}
对局部变量的生命周期进行控制。
2,构造代码块。类内 {}
对所有对象进行初始化。
3,静态代码块。类内 static{}
对类进行初始化。


三:this和super

1.this 当前对象的引用,this()只能定义在本类构造函数第一行(可以解决成员变量和局部变量的重名问题,可以用于比较是否同一对象)
2.super 父类对象的引用,super()只能定义在子类构造函数第一行
3.this()和super()不能重复出现在子类构造方法中

四:static特点:

1.随着类的加载而加载
2.优先于对象存在
3.被所有对象共享
4.可以直接被类名调用(类名.方法/属性)类变量:静态变量,实例变量:成员变量,局部变量


五:方法重载和重写区别

重载,overload,同一个类,方法签名不同(方法名相同,参数类型或者个数不同),与返回类型无关
重写,override,父子两类,方法签名一致,权限子类>=父类,父类私有方法不能重写,静态只能覆盖静态,或者被静态覆盖,重写又称为覆盖

 

六:开闭原则

对扩展开放,对修改关闭

 

七:final特点

1,final是一个修饰符,可以修饰类,方法,变量。
2,final修饰的类不可以被继承。所以不能和abstract同时出现
3,final修饰的方法不可以被覆盖。
4,final修饰的变量是一个常量,只能赋值一次。
为什么要用final修饰变量。其实在程序如果一个数据是固定的,
那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。
而且这个变量名称的值不能变化,所以加上final固定。

写法规范:常量所有字母都大写,多个单词,中间用_连接。


八:抽象类和接口的异同点


单继承,abstract,extends
多实现,interface,implements

特点:
抽象类:声明方法的存在而不去实现它的类叫抽象类,
不能创建abstract的实例,但可以创建一个变量,类型为抽象类,并让它指向具体子类的一个实例
可以没有抽象方法,但有构造函数,可以用于子类初始化
为了不让别人去创建对象,如AWT的适配器对象
抽象关键字不可以和那些关键字共存?private,static,final

接口:是抽象类的变体。
成员变量:public static final 修饰的静态常量,
成员函数:public abstract 所有方法都抽象,用A instanceof B来查看A 是否是 B的父类/接口

相同点:
都是不断向上抽取而来的。


不同点:
1,抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2,抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
接口中只能定义抽象方法,必须由子类去实现。
3,抽象类的继承,是is a关系,在定义该体系的基本共性内容。
接口的实现是 like a 关系,在定义体系额外功能。


九:面向对象的特性:


1.抽象 abstract 抽象关键字不可以和那些关键字共存?private,static,final
特点:笼统,模糊,看不懂!不具体,一种过程,在这个过程中,隐藏了实现细节;
好处:给第三个特征多态提供了前提
2.封装 private
特点:隐藏对象的属性和实现的细节,提供公共的访问方式(private 属性,提供public方法给外部使用)
好处:安全性提高,复用性提高,隔离性提高,使用性方便
3.继承 extends,absturts,
特点:是一种联结类的层次模型,类的重用来表述共性的方法
好处:1,复用性提高。2,让类与类之间产生了关系,给第三个特征多态提供了前提.
继承弊端:打破了封装性
4.多态 前提:继承/实现 方法重写
特点:某一类事物具备的多种表现形态 (参数化多态性,包含多态性)
好处:好处是提高了程序的扩展性,
缺陷是只能使用父类的引用访问父类的方法,无法访问子类的特有方法。需要转型,向下转型(向子类转型)父类instanceof子类


九2:其他


1.接口的特点:
对外暴露规则
程序功能扩展
降低代码耦合性

2.多态时,成员的特点:
(1),成员变量。
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。哦了。
作为了解。

 

(2),成员函数(非静态)。
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。

因为成员函数存在覆盖特性。


(3),静态函数。
编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说,编译和运行都看左边。

其实对于静态方法,是不需要对象的。直接用类名调用即可。


十:内部类(成员内部类、局部内部类、匿名内部类、静态内部类)


内部类访问特点:
1,内部类可以直接访问外部类中的成员。
2,外部类要访问内部类,必须建立内部类的对象。

1.成员内部类
外围类的一个成员,可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
创建 内部类对象:Outer.Inner in = new Outer().new Inner();
2.局部内部类:
方法内,只能在该方法和属性中被使用,出了该方法和属性就会失效。
内部类在局部位置上只能访问局部中被final修饰的局部变量
创建 内部类对象
3.静态内部类
如果内部类中定义了静态成员,该内部类也必须是静态的。
创建 内部类对象:Outer.Inner in = new Outer.Inner();
4.匿名内部类
一个匿名子类对象。
必须有前提:内部类必须继承或者实现一个外部类或者接口。
格式:new 父类or接口(){子类内容}


十一:设计模式

1.单例模式
饿汉式:类加载,对象就已经存在(开发推荐使用)
懒汉式:类加载,没有对象,只有调用getInstance()方法才创建对象,多线程存在安全性(常面试,存在多线程安全问题)

 

设计模式:对问题行之有效的解决方式。其实它是一种思想。
解决的问题:就是可以保证一个类在内存中的对象唯一性。

必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

如何保证对象唯一性呢?
1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。

步骤:
1,私有化该类构造函数。
2,通过new在本类中创建一个本类对象。
3,定义一个公有的方法,将创建的对象返回。
//饿汉式
class Single//类一加载,对象就已经存在了。
{
  private static Single s = new Single();
  private Single(){}
  public static Single getInstance()
  {
    return s;
  }
}


//懒汉式
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。
{
  private static Single2 s = null;
  private Single2(){}
  public static Single2 getInstance()
  {
    if(s==null)
      s = new Single2();
      return s;
    }

  }
}


十二:一个对象实例化过程:

Person p = new Person();
1,JVM会读取指定的路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中的开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6,父类初始化完毕后,在对子类的属性进行显示初始化。
7,在进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量.

 

十二2:类构造函数中运行顺序:

子类构造方法开始
fu类构造方法super();
显示初始化
构造代码块初始化
子类构造方法结束

posted @ 2019-08-17 01:11  月落书香  阅读(229)  评论(0编辑  收藏  举报