1:final关键字可以干什么?有什么特点?
答:final表示最终,终态的意思,不能被更改的
1. 修饰类时,该类不能被继承
修饰成员方法时,成员方法不能被重写
修饰变量时,此时变量是一个常量
2.final修饰基本类型时,该类型的值不能改变
修饰引用类型时,该引用值的地址值不能再改变了,但是堆内存中的成员变量值可以改变
3.final成员变量必须由程序员显示初始化,系统不会对final成员变量 默认初始化
2:final关键字的面试题?
package org.westos.finaldemo;
class Fu{
public final void show() {
System.out.println("这是一个绝密文件,任何多不能更改...");
}
}
//Zi类
class Zi extends Fu{
// public void show() {//Cannot override the final method from Fu :不能重写被final修饰Fu类的方法
// System.out.println("这是一堆垃圾....");
// }
}
//测试类
public class ZiDemo {
public static void main(String[] args) {
Zi zi =new Zi() ;
zi.show();
}
}
3:多态是什么,前提是什么?
多态是在同一个时刻,体现出的不同状态
多态前提:必须要继承关系
必须有方法重写
必须有父类的引用指向子类对象
4:多态中成员访问的特点?
成员变量 :编译看左,运行看左
成员方法(非静态):编译看左,运行看右(存在方法重写)
构造方法:无论是子类还是父类都是对对象进行初始化
静态成员方法:编译看左,运行看左
5:多态的好处及弊端?如何解决多态的弊端?
好处:提高代码复用性,由继承保证
提高代码扩展性,由多态保证(父类引用指向子类对象)
弊端:通过父类的引用调用子类特有功能,不能调用,
解决:需要向下转型
6:什么是向上转型?什么是向下转型?
向上转型:父类名 f =new 子类名();
向下转型:子类名 s=(子类名)f;
7:抽象类概述及其特点?
1.抽象类的概念:
Java中,如果一个类中有一个方法声明(抽象方法)抽象功能,那么这个类定义为抽象类
2.关键字:abstract 抽象的意思
3.抽象类的特点:抽象类不能直接实例化!(不能创建对象) 接口也不能实例化
如果一个类中有抽象方法,那么这个类是一定是一个抽象类
抽象类中不一定都是抽象方法
4.抽象类的子类
如果子类是抽象类,没有意义,因为都不能实例化
子类具体类,那么子类必须实现父类中的抽象功能.
8:抽象类成员特点?
抽象类的成员特点:
成员变量: 可以是变量,也是一个常量
构造方法:可以有无参,可以有有参,作用:给对象进行初始化的.
成员方法:可以有抽象方法,还可以有非抽象方法.
abstract 和private,final,static不能共有
9:抽象类的小问题
A:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,一个抽象类可以没有抽象方法,但由抽象 方法的一定是抽象类
B:abstract不能和哪些关键字共存
final static private
10:接口的概述及其特点?
1.接口:体现的是事务的扩展性功能(额外动作,后天经过学习等等)
接口格式
interface 接口名{
//抽象功能
public abstract void jump()
}
2.接口的特点:不能实例化
接口的子实现类:实现类 (具体的实现类)
class 类名+impl implements 接口名{
}接口的子类如果是抽象类:没有意义,不能实例化
11:接口的成员特点?
成员变量:是一个常量,不能更改,并且默认的修饰符
public static final:
构造方法:接口不存在构造方法
成员方法:都是抽象方法
默认的修饰符:public abstract
12:抽象类和接口的区别?
1. 成员的区别
成员变量:
抽象类:既可以常量,也可以是变量
接口:只能是常量,默认的修饰符:public static final
构造方法:
抽象类:有构造方法,无参/有参 (给对象进行初始化的)
接口:没有构造方法
成员方法:
抽象类:可以有抽象方法,也可以有非抽象方法
接口:只能是抽象方法 :默认的修饰符:public abstract
2.类与类/类与接口关系的区别
类与类之间的关系:
继承关系,只支持单继承,不支持多继承,但是可以多层继承
类与接口的关系:
实现关系,一个类继承另一个类的同时,还可以实现多个接口...
接口与接口的关系:
是一种继承关系,既可以单继承,也可以多继承...
接口1 extends 接口2,接口3...
3.设计原则的 区别
抽象类: 是有继承关系---->体现的是一种"is a"的关系 (A是B的一种或者B是A的一种)
接口:类和接口:实现关系--->体现的是一种"
13:编程题:
老师和学生案例,加入抽烟的额外功能 (自己给定成员,测试即可!)
package org9;
public class people {
private String name;
private int age;
//无参构造
public people() {
super();
}
//有参构造
public people(String name, int age) {
super();
this.name = name;
this.age = age;
}
//公共访问方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study() {
System.out.println("好好学习");
}
public void smoke() {
System.out.println("抽烟");
}
}
public class student extends people {
public student() {
super();
}
public student(String name, int age) {
super(name, age);
}
public void study() {
System.out.println("学生在学习Java");
}
public void smoke() {
System.out.println("学生抽烟");
}
}
public class teacher extends people {
public teacher() {
super();
}
public teacher(String name, int age) {
super(name, age);
}
public void study() {
System.out.println("老师在教课");
}
public void smoke() {
System.out.println("老师不抽烟");
}
}
public class peopleTest {
public static void main(String[]args) {
student s=new student("jeffery",22);
System.out.println(s.getName()+" "+s.getAge());
s.study();
s.smoke();
teacher t=new teacher("张三",35);
System.out.println(t.getName()+" "+t.getAge());
t.study();
t.smoke();
}
}
14: 代码块是什么?代码块的分类和各自特点?
用{}括起来的代码,统称为代码;
根据其位置以及声明不同:分为以下:
局部代码块: 在main()里面,给变量限定它的生命周期
构造代码块:在一个类中的成员位置中,用{}括起来,
作用:可以将多个构造方法中的相同的代码放到构造代码块中,对对象进行初始化.
在每次执行构造方法之前,先执行构造代码块.
静态代码块:在一个类的成员位置,也是用{}包起来,但是他被static修饰
作用:一般情况 它的作用给类进行初始化
15 静态代码块,构造代码块,构造方法的执行流程?
先执行静态代码块,再执行构造代码块,最后执行构造方法
16:继承的好处
1)提供了代码复用性,解决了代码的臃肿
2)它是多态的前提(多态的前提是必须有继承关系)
17:Java中继承的特点
1.子类继承父类,是继承了父类所有的东西(成员变量,成员方法,包括私有),但是子类不能使用私有的东西,只能通过父类的公共 的访问间的让子类访问
2.在Java中,继承只支持单继承,不支持多继承(子类名 extends 父类名1,父类名2,...)
但是Java可以多层继承
18:Java中继承的注意事项?以及我们什么时候使用继承?
1)构造方法不能被继承,但是通过super关键字去访问
2)私有的可以间接的去访问
不要随意的使用继承,只要有"is a"的关系就使用它..
19:面试题:
方法重写和方法重载的区别?点:
Overload
Override
重载:一个类中有一个方法A,你又在这个类中创建了一个方法B,方法B的名字和A一样,返回值类型也一样,但是参数的类型或个数不同,此时B重载了A。
重写:一个类M继承另一个类N,N中有一个方法A,这时你在M写了一个方法B,方法B的名字、返回值以及参数都和A一样,此时B重写了A。
20 下列有关类、对象和实例的叙述,正确的是哪一项?(D)
A.类就是对象,对象就是类,实例是对象的另一个名称,三者没有差别
B.对象是类的抽象,类是对象的具体化,实例是对象的另一个名称
C.类是对象的抽象,对象是类的具体化,实例是类的另一个名称
D.类是对象的抽象,对象是类的具体化,实例是对象的另一个名称
21 下列有关抽象类的叙述正确的是哪项?(C)
A.抽象类中一定含有抽象方法
B.抽象类既能被实例化也能被继承
C.抽象类的声明必须包含abstract关键字
D.抽象类中不能有构造方法
22 下列有关接口的叙述错误的是哪项?(D)
A.接口中只能包含抽象方法和常量
B.一个类可以实现多个接口
C.类实现接口时必须实现其中的方法
D.接口不能被继承
23 下列关于类的继承的描述,正确的有( BD )
A. 一个类可以同时继承多个父类
B. 一个类可以具有多个子类
C. 子类会自动拥有父类所有的方法
D. 一个类继承另一个类需要使用 extends 关键字
24 下列关于构造函数的说法正确的是( AB )
A. 方法名必须与类名相同
B. 使用new关键字创建对象时,java虚拟机会自动调用构造函数
C. 我们在定义一个类时,必须要声明至少一个构造函数
D. 构造函数中不能使用return语句(这个是错的,可以rutrun;)
25. 关于继承, 以下说法正确的是: (A)
A.Java中只支持单继承, 一个类只能继承一个类, 但是可以有多个子类
B.一个类如果没有自己写无参构造方法, 那么子类将无法继承
C.子类可以当父类用, 父类不可以当子类用
D. 子类重写父类方法时访问权限不能更低
26 运行以下的main()方法,结果是?( C )
1 public static void main(String[] args)
2 {
3 String myString;
4 int x = 100;
5
6 if (x < 100) myString = "x is less than 100";
7 if (x > 100) myString = "x is greater than 100";
8 System.out.println(myString.length());
9 }
A. 编译时报出错误提示信息“变量myString没有被初始化”
B. 编译通过
C. 编译未能通过。但如果变量myString在第8行前的代码中被初始化,代码可以编译通过,运行时可以输出字符串myString的长度
D. 以上都不对