day_10 刷题日记

1.关于jdbc statement的说法

  • JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。

  • 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象”

  • PreparedStatement中,“?” 叫做占位符,一个占位符就是一个值

  • PreparedStatement可以阻止常见的SQL注入式攻击

2.在牛客网上刷题看到这样一类题目,就是把static修饰的变量放在方法里,如果你对static不清楚的话,就容易选错,实际上这种情况根本编译都不能过。举个考察的例子:

//example 1
public class Test {
    static String x="1";
    static int y=1;
    public static void main(String args[]) {
        static int z=2;
        System.out.println(x+y+z);
    }
}


//example 2
public class Test {
    public int aMethod(){
        static int i = 0;
        i++;
        return i;
    }
public static void main(String args[]){
    Test test = new Test();
    test.aMethod();
    int j = test.aMethod();
    System.out.println(j);
    }
}

上面这个代码是编译错误的,原因是被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量。

3.下面代码的执行结果是?C

public class Test {
  public static void main(String args[]) {
    int i = -5;
    i =  ++(i++);
    System.out.println(i);
  }
}

-7
-3
编译错误
-5

在评论区看到AirAnYv的楼主解释挺好的,拿上来分享下。

1.先执行括号中的i++ 在执行i++的时候 Java会将i先存放到一个临时变量中去 并返回该临时变量的值(假设为temp)

2.所以 这句可以拆成 temp = i (值为-5) 并返回temp的值 然后 i自加1 此时 i 的值为-4 但是之后 执行就会出现问题 由于返回了temp的值 继续执行的表达式为 i = ++(-5); 单目运算符无法后跟一个字面量 所以在IDEA编辑器中提示Variable expected(此处应为变量) 故选择C选项

4.还有就是关于内部类的题目,错了N遍系列。在这里总结一下内部类的一些问题。

  • 每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响
  • 成员内部类实例化对象的时候只有在静态方法里才必须使用外部类对象来创建吧,在实例方法里创建内部类对象则不用依赖外部类对象。
public class Test04 {
	class Subtest{
		int a;
		int b;
	}

	void say(){
		Subtest a=new Subtest();
	}
	public static void main(String[] args) {
		//'exam.offer.day04.Test04.this' cannot be referenced from a static context
		//Subtest b=new Subtest();
		Test04 o=new Test04();
		Subtest b=o.new Subtest();
	}
}
  • 关于匿名内部类:
    • (1).匿名内部类是直接使用 new 来生成一个对象的引用
    • (2).对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用;
    • (3).使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口;
    • (4).匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法;
    • (5).匿名内部类中不能存在任何的静态成员变量和静态方法,匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法
    • (6).匿名内部类初始化:使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果
  • 关于成员内部类:
    • 1.Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
    • 2.Inner 类中定义的 show() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性age
    • 3.在牛客网上看到一个说法:定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );,这样说实际上是不清晰的,实际上,表述为成员内部类实例化对象的时候只有在静态方法里才必须使用外部类对象来创建吧,在实例方法里创建内部类对象则不用依赖外部类对象。
    • 4.编译上面的程序后,会发现产生了两个 .class 文件: Outer.class,Outer$Inner.class{}
    • 5.成员内部类中不能存在任何 static 的变量和方法,可以定义常量:
      • (1).因为非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖于对象的,仅与类相关,
        简而言之:在加载静态域时,根本没有外部类,所在在非静态内部类中不能定义静态域或方法,编译不通过;非静态内部类的作用域是实例级别
      • (2).常量是在编译器就确定的,放到所谓的常量池了

题目:往OuterClass类的代码段中插入内部类声明, 哪一个是错误的:ABCD

public class OuterClass{
    private float f=1.0f;
    //插入代码到这里
}


class InnerClass{
public static float func(){return f;}
}

abstract class InnerClass{
public abstract float func(){}
}

static class InnerClass{
protected static float func(){return f;}
}

public class InnerClass{
 static float func(){return f;}
}

A和C都是因为静态方法访问了非静态常量所以错误,B是因为func()有方法体,而D选项是因为只有静态类才能静态方法,除此之外,访问了非静态变量,错上加错。

发布了58 篇原创文章 · 获赞 5 · 访问量 6258

猜你喜欢

转载自blog.csdn.net/weixin_40992982/article/details/104045907
今日推荐