【每日一题】本期部分题难度较高

编辑:刘建阳   来源:itheima666   程序开发   2017-12-07 09:00:39

Java

问:父类实现了 Serializable 接口后如何不修改父类的情况下让子类不可序列化?

答:这个题目其实违反了里氏替换原则(子类对象可以无条件的替换父类对象),不过面试官可能是想考察系列化的自定义操作,所以下面给出一个答案,如下:

class SubClass extends SuperSerializableClass {

   private void writeObject(java.io.ObjectOutputStream out)

                                       throws IOException {

       throw new NotSerializableException("XXX");

   }

   private void readObject(java.io.ObjectInputStream in)

                       throws IOException, ClassNotFoundException {

       throw new NotSerializableException("XXX");

   }

   private void readObjectNoData() throws ObjectStreamException {

       throw new NotSerializableException("XXX");

   }

}

(提示:代码可以左右滑动)

Java

问:父类实现了 Serializable 接口后如何不修改父类的情况下让子类不可序列化?

答:因为在父类没有实现 Serializable 接口时虚拟机是不会序列化父对象的(即序列化后的流中没有父类信息),而一个 Java 对象的构造必须先有父对象才有子对象,反序列化也一样,所以反序列化时为了构造父对象只能调用父类的无参构造方法作为默认的父对象,故要让一个没有实现 Serializable 接口的父类能够序列化则必须要求父类有无参构造方法且子类负责序列化(反序列化)父类的域。如下给出实现样例:

abstract class Base {

   public int value;

   public Base(int value) {

       this.value = value;

   }

   public Base() {}

}

class Sub extends Base implements Serializable {

public int subvalue;

public Sub(int value, int subvalue) {

super(value);

this.subvalue = subvalue;

}

private void writeObject(java.io.ObjectOutputStream out) throws IOException {

       out.defaultWriteObject();

       out.writeInt(value);

}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {

       in.defaultReadObject();

       value = in.readInt();

}

}

(提示:代码可以左右滑动)

所以为一个没有实现 Serializable 接口的父类编写一个能够完全序列化的子类需要父类有一个无参构造方法且子类要先序列化自身,然后子类负责序列化父类的域。

PHP

问:描述一下php开发中常见的几种攻击以及解决方案 

答:SQL注入: 

解决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。 

跨站点脚本攻击(XSS): 

strip_tags() 函数,这个函数可以清除任何包围在 HTML 标记中的内容 

或者使用htmlspecialchars() 函数。

C++基础

问:在什么时候需要使用“常引用”?

答:如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

例1

int a ;

const int &ra=a;

ra=1; //错误

a=1; //正确

例2

string foo( );

void bar(string & s);

那么下面的表达式将是非法的:

bar(foo( ));

bar("hello world");

原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 。

前端

问:CSS清除浮动的几种方法(至少两种)

答:使用带clear属性的空元素

使用CSS的overflow属性

使用CSS的:after伪元素

使用邻接元素处理

扫码关注黑马程序员

获取更多一线资讯,及热门学习资源

标签: 程序员,对象,函数,序列,使用,引用,value