1.抽象类为什么不能直接创建对象?
(1)抽象类是什么?
抽象类是用来表征对问题领域进行分析,设计中得出的抽象概念,是对一系列看上去不同,但本质上相同的具体概念的抽象。
通常在编译语句中用abstract修饰的类是抽象类。在c++中,含有纯虚拟函数的类称为抽象类,它不能创建对象;在java中,含有抽象方法的类称为抽象类,它同样也不能创建对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
(2)抽象方法(由子类具体实现)
java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型,方法名称和所需的参数,没有返回方法体,也就是抽象方法只需要声明而不需要实现。抽象方法不能被调用。
(3)抽象类为什么不能创建对象?
首先,与具体的类进行比较:抽象类不能实例化,并且不能使用new创建对象(如果使用,会导致编译时错误)。虽然一些变量和值在编译时的类型可以为抽象的,但是,这些变量和值必须为null,或者说含有对非抽象类的实例的引用(此非抽象类是从抽象类派生出来的),允许抽象类包含抽象成员。
其次,与接口进行比较:
相同点:(1)抽象类和接口都不能直接实例化(创建对象);
(2)抽象类的子类(或接口的实现类),都必须实现抽象类(或接口)中全部的抽象方法,才可以被实例化,否 则,该类仍然为抽象类
不同点:(1)关键字不同,抽象类子类使用extends关键字实现抽象类;接口实现是使用关键字implements来实现接口
(2)抽象类中可以有构造方法;接口中不能有构造方法
(3)抽象类中既可以有抽象方法也可以有普通方法;接口中只能有抽象方法
(4)权限修饰不同:抽象方法可以有public,protected和default这些修饰符;接口方法只能是public
(5)抽象类中的变量可以是普通变量;接口中定义的变量只能是公共的静态变量
(6)抽象方法可以继承单个类和实现多个接口;接口可以多继承接口
(7)速度:抽象类比接口的速度要快,接口稍微有点慢,需要时间去寻找在类中实现的方法
注意:
(1)一个类中如果有抽象方法,那么这个类只能是抽象类
(2)抽象方法要被实现,所以不能是静态的,也不能是私有的
(3)接口中只能含有未被实现的方法,也叫抽象方法;但是不能用abstract关键字修饰
总结:总的来说
1.子类更具体,父类更抽象 直接创建父类对对象本身没有意义
2.如果创建的是父类对象在调用的时候,调用的父类中的方法而非子类的方法,它违背了多态的思想和设计
3.因为父类引用指向子类对象时,调用的方法时子类重写的方法,一般父类中的描述不够具体,并不是说抽象类的构造方法没有意义,那么在创建子类对象时需要先调用父类的构造方法
2.SQL查询语句关键字的执行顺序
(1)MySql语法顺序
select[distinct]
from
join (如left join)
on
where
group by
having
union
order by
limit
(2)MySql执行顺序,即在执行sql按照下面顺序进行执行
from
on
join
where
group by
having
select
distinct
union
order by
3.Statement和PreparedStatement的区别
(1)什么是Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。
(2)Statement对象用于将SQL语句发送到数据库中,实际上有Statement有三种对象,Statement它们都作为在给定连接上执行SQL语句的包容器:Statement,PreparedStatement(它是由Statement上继承来的),CallableStatement(它从PreparedStatement继承来的)。它们都专用于发送特定类型的SQL语句:Statement对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或不带参数的预编译的SQL语句;CallableStatement对象用于执行对数据库已存储过程的调用。
总结如下:Statement每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.但存在sql注入风险。PreparedStatement是预编译执行的。在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。安全性更好,有效防止SQL注入的问题,有更好的可读性和可维护性。对于多次重复执行的语句,使用PreparedStatement效率会更高一点。
(3)PreparedStatement: 数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用。 从安全性上来看,PreparedStatement是通过?来传递参数的,避免了因sql而出现sql注入的问题,所以安全性较好。 在开发中,推荐使用 PreparedStatement