-
- java基础
- 17.请说出作用域public,private,protected以及不写(friendly)的时候的区别
- 18.overload和override的区别?overload的方法是否可以改变返回值的类型(是否能够通过返回值类型的不同来实现overload)?
- 19.构造器constructor是否可以被override?
- 20.接口可否继承接口?抽象类可否实现implements接口?抽象类是否可以继承concrete class具体类?抽象类中是否可以有静态的main方法?
- 21.写clone()方法是,通常都有一行代码,是什么?
- 22.面向对象的特征有哪些?
- 23.java中实现多态的机制是什么?
- 24.abstract class 和 interface有什么区别?
- 25.abstract的方法可否同时是static,native,synchronized?
- 26.什么是内部类?static Nested Class 和 Inner Class的不同
- 27.内部类可以引用的包含类的成员吗?有没有什么限制?
- 28.Anonymous Inner Class(匿名内部类)是否可以继承其他类,是否可以implements接口?
- java基础
java基础
17.请说出作用域public,private,protected以及不写(friendly)的时候的区别
作用域 | 当前类 | 同一包 | 子孙类 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
friendly | Y | Y | N | N |
private | Y | N | N | N |
只要记住4种访问权限(public ,protected,friendly,private),和4种访问范围(当前类,同一包,子孙类,其他包),很容易画出上图。
18.overload和override的区别?overload的方法是否可以改变返回值的类型(是否能够通过返回值类型的不同来实现overload)?
overload
1.overload表示重载,表示一个类中可以有多个名称相同的方法,但是这些方法的参数列表各不相同(参数的个数或者类型不同(顺序问题也是类型问题))。
2.对于overload方法返回值的问题,如果几个overload方法的参数列表不一样,那么返回值当然可以不一样,也能够构成重载。
如果说参数列表是一样的,但是返回值类型不同的,想通过返回值类型的不同来构成方法重载,是不行的,而且会报错。原因在于我们调用方法的时候是不关心方法的返回值的,只根据方法名和参数列表来确定方法,如果这时候出现方法名和参数列表一样的方法,那么java无法确定是调用哪个方法。
3.使用方法重载时需要注意的a.参数列表:参数列表的意思是不同的参数类型,不同的参数个数,不同的参数顺序(fun(int a1,int a2)和fun(int a2, int a1)属于同一种顺序,要注意区别)
b.访问权限,返回类型,异常:不能通过访问权限,返回类型,抛出的异常进行重载
c.访问权限,返回类型,异常:方法的异常类型和数目不会对重载造成影响
d..访问权限,返回类型,异常:对于继承来说,如果某一种方法在父类中访问权限是private,那么就不能在子类中对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果(被private修饰根本不能继承)
所以说overload方法与返回值无关,只与参数列表有关
override
1.override重写表示子类中的方法可以与父类中的某个方法的名称和参数完全一致,通过子类的实例对象调用这个方法的时候,将调用子类的定义方法,这相当于把父类定义的那个完全一样的方法给覆盖了,这也是面向对象编程的一种表现。
2.子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子类异常,因为子类可以解决父类的一些问题,但是不能比父类有更多的问题,子类的访问权限只能比父类的更大,不能更小,如果父类的就是private类型,那么子类就不存在覆盖的限制
3.对于我们来说最熟悉的重写(覆盖)就是对接口方法的实现,对于重写来说要注意以下几点a.方法名:覆盖的方法名必须与被覆盖的方法名完全一致,才能达到覆盖的效果
b.返回值:覆盖方法的返回值必须与被覆盖方法的返回值一致
c.异常:覆盖方法所抛出的异常必须要与被覆盖方法所抛出的异常一致,或者是其子类
d.访问权限:被覆盖的方法不能是private,否则只是在其子类中定义了一个新的方法,并没有被覆盖
19.构造器constructor是否可以被override?
构造器constructor不能被继承,因此不能被重写override,但是可以被重载overload
20.接口可否继承接口?抽象类可否实现implements接口?抽象类是否可以继承concrete class具体类?抽象类中是否可以有静态的main方法?
都可以
抽象类与普通类的唯一区别:不能创建实例对象和允许有abstract方法。
21.写clone()方法是,通常都有一行代码,是什么?
clone有缺省行为
super.clone()
因为首先要把父类中的成员复制到位,然后才是赋值自己的成员
22.面向对象的特征有哪些?
23.java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或者具体的实现类的实例对象,而程序调用的方法在运行期在动态绑定,就是引用变量所指向的具体的实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
24.abstract class 和 interface有什么区别?
abstract
含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必一定是抽象的,abstract类中定义的抽象方法必须在具体的子类中实现,所以,不能有抽象的构造方法或者抽象的静态方法,如果子类中没有抽象父类中所有的抽象方法,那么这个子类也要被定义为abstract类型
interface
接口可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的,接口中的方法都默认定义为public abstract类型(即使不写也相当于又默认修饰符),接口中的成员变量都默认定义为public static final
语法区别
1.抽象类可以有构造方法,接口中不可以有构造方法
2.抽象类中可以有普通的成员变量,而接口中没有普通的成员变量(全部默认用public static final 修饰)
3.抽象类中可以包含有非抽象的普通方法,接口中所有方法都是抽象的,不能有非抽象的普通方法
4.抽象类中的抽象方法的访问类型可以是public,protected,但是接口中的抽象方法只能是public类型的,并且默认是public abstract类型
5.抽象类中可以包含静态方法,接口中不能有静态方法
6.抽象类和接口中都可以包含静态的成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
7.一个类可以实现多个接口,但是只能继承一个抽象类
应用区别
接口更多的是在系统架构设计方法发挥作用,主要定义模块之间的通信契约。而抽象类在代码的实现方面发挥作用,可以实现代码的重用。
例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的servlet类都要用相同的方式进行判断,记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的servlet都继承这个基类,在抽象基类的service方法中完成权限判断,记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。
25.abstract的方法可否同时是static,native,synchronized?
1.abstract的方法不可以是static的,因为抽象方法是被子类实现的,而static与子类扯不上关系
2.native方法表示该方法是要用另一种依赖平台的编程语言实现的,不存在被子类实现的问题,所以他也不能是native的
3.synchronized也不行
26.什么是内部类?static Nested Class 和 Inner Class的不同
27.内部类可以引用的包含类的成员吗?有没有什么限制?
完全可以,如果不是静态内部类,那没有什么限制
如果你把静态嵌套类作为内部类的一种特例,那再这种情况下不可以访问外部类的普通成员变量,只能访问外部类的静态成员成员。例如:
class Outer{
static int x;
static class Inner{
void test(){
System.out.println(x);
}
}
}
28.Anonymous Inner Class(匿名内部类)是否可以继承其他类,是否可以implements接口?
可以继承其他类或实现其他接口,不仅是可以,而且是必须。