一、对象和类
- 修饰符混用:
abstract
不能与final
并列修饰同一个类abstract
类中可以有private
的成员abstract
方法可以放在abstract
类或接口中static
方法中能直接使用非static
的属性(×)改:静态方法中不能引用其外部的非静态成员
- 静态块是类加载的时候就会被执行到的,静态执行顺序是按照在类中出现 的先后顺序执行
- 构造方法没有返回类型
- 静态变量可以通过类名调用
.java
文件中先使用package
关键字,其次使用import
关键字,最后使用class
关键字- 常量是
public final
修饰的,例:public final int MAX_LENGTH=100;
- 在子类构造方法的开始默认情况下有一句
super();
来调用父类的构造方法 - 对于顶层类(外部类)来说,只有两种修饰符:
public
和默认(default
)。
因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。 因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public
和默认(default
)。 但是private
可以修饰class
的,只不过该类不能使顶层类,可以是内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private
),同包(default
),父子类(protected
),任何位置(public
)。 当一个内部类使用了private修饰后,只能在该类的外部类内部使用 - 在类方法中不能使用
this
关键字;在类方法中可以调用其它类中的类方法;在类方法中可以通过实例化对象调用实例方法;在类方法中调用本类的类方法时可直接调用 - 面向对象的三大主要特征是:封装、多态、继承
- 下面哪个函数是
public void method(){...}
的重载函数( )
A.public void method(int m){...}
B.public int method(){...}
C.public void method2(){...}
D.public int method(int m, float f){...}
【正确答案】A,D
【答案解析】重载:方法名相同且参数列表不同,与返回值类型无关 - 下面选项中哪两个可以在
A
的子类中使用( )
A.class A { protected int method1 (int a, int b) { return 0; } }
public int method1(int a, int b) { return 0; }
B.private int method1(int a, int b) { return 0; }
C.private int method1(int a, long b) { return 0; }
D.public short method1(int a, int b) { return 0; }
【正确答案】A,C
【答案解析】B选项中,子类重写父类的方法,访问权限不能降低;C选项中,属于重载;D选项中,子类重写父类的方法如果返回值类型是基本类型的话,要求相同 - 使用
this
调用本类中其它的构造方法 - 变量及其范围:
- 类中的普通属性是类的实例变量
- 实例变量用关键字
static
声明 (×)改:由static
修饰的变量称为类变量或是静态变量 - 局部变量作用域只在局部范围内部
- 局部变量在使用前必须被初始化
- 已知下列选项中的方法是在某个类中定义的,现在子类中不可以定义与下列选项中方法签名相同的方法的选项是( )
A.final void methoda() {}
B.void methoda() {}
C.static void methoda() {}
D.static final void methoda() {}
【正确答案】A,D
【答案解析】final
修饰方法,在子类中不能被重写 - 如果
package
语句存在,则必须出现在源文件的非空白首行;如果在源文件中声明了一个public
接口,则其名称必须和源文件名一致;import
是写在package
下;选项main
方法可以放在类里任意一个地方 - 实例方法和类方法:
- 实例方法只能访问实例变量(×)改:实例方法可以访问类变量
- 类方法既可以访问类变量,也可以访问实例变量 (×) 改:类方法只能访问类变量
- 类方法只能通过类名来调用(×)改:类方法可以通过对象调用
- 实例方法只能通过对象来调用
- 在创建对象时,必须对象是先声明,声明后会在给对象在内存里开辟空间,之后初始化,再进行使用
- 本类实例方法不可以调用其他类的私有实例方法;本类实例方法不可以调用其他类的私有类方法;本类实例方法不可以直接通过方法名调用其他类的实例方法;本类中实例方法可以直接通过方法名调用本类中其他实例方法
instanceof
是 Java 的一个二元操作符,它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean
类型的数据。Teahcer
和Student
之间没有继承关系不能做强制类型转换- 构造方法的作用是在实例化对象的时候给属性成员进行初始化;类中如果没有显示的给出构造方法,系统会提供一个无参构造方法;构造方法与类同名,类中可以有和类名相同的方法;构造方法可以重载
- 面向对象概念:
- 程序中的对象是一种数据信息,并非现实中的实际物体
- 在现实生活中,对象是指客观世界的实体
- 在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(
class
) - 在程序中,对象是一组变量和相关方法的集合
二、JAVA内存管理
- 内存回收(负责释放无用内存):垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用
System.gc()
方法来"建议"垃圾收集器去进行垃圾回收处理,但其是否可以执行,什么时候执行却都是不可知的。 - Java语言中,程序为对象动态分配内存。Java中内存分配的运算符是
new
- 栈(
stack
)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表,即存取受限的线性结构
三、继承
- 当子类隐藏了父类的变量,并重写了父类方法后,又要使用父类变量或父类被重写的方法时,可通过
super
来实现对父类变量的访问和对父类方法的调用。super
是用来引用当前对象的父类 - Java规定,子类只能有一个父类而父类可以有多个子类
- 在下面程序的第7行补充上下列哪个方法,会导致在编译过程中发生错误( )
A.1) class Super { 2) public float getNum() { 3) return 3.0f; 4) } 5) } 6) public class Sub extends Super { 7) // TODO ... 8) }
public float getNum(){retun 4.0f;}
B.public void getNum(){}
C.public void getNum(double d){}
D.public double getNum(float d){retun 4.0f;}
【正确答案】B
【答案解析】方法重写、重载的问题:重写要求方法签名完全相同,返回值类型如果是基本类型或无返回值时必须一致。重载要求方法名相同且参数列表必须不同,与返回值类型无关 - 重载,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法
- 下列代码执行的结果是()
A.class Base { void test() { System.out.print("Base.test()"); } } class Child extends Base { void test() { System.out.print("Child.test()"); } static public void main(String[] a) { Child anObj = new Child(); Base baseObj = (Base)anObj; baseObj.test(); } }
Child.test()Base.test()
B.Base.test()Child.test()
C.Base.test()
D.Child.test()
【正确答案】D
【答案解析】测试代码相当于:Base baseObj = new Child();
父类的引用指向子类的实例,子类又重写了父类 的test()
方法,因此调用的是子类的test()
方法 - 方法重写返回值类型如果是基本类型应与父类的一致
四、访问控制
区分Java中作用域【public、private、protected以及不写】可点击本处
private
修饰的变量说明变量为私有访问。只能被该类自己访问或调用,是对成员变量的高级保护- 静态方法中可以直接调用使用其外部的静态成员
- 已知A类在
package A
中,B
类在package B
中,且B类被声明为public
,且有一个成员变量x
被声明为protected
控制方式。C
类也位于package A
包中,且继承了B
类。则以下说法正确的是( )
A.A
类的实例不能访问到B
类的实例
B.A
类的实例能够访问到B
类一个实例的x
成员
C.C
类的实例可以访问到B
类一个实例的x
成员
D.C
类的实例不能访问到B
类的实例
【正确答案】C
【答案解析】不同包子类的关系, 可以访问到父类B
的protected
成员 - 抽象方法不能有方法体;方法中定义的是局部变量,不能用类成员变量修饰符
private
;final
修饰为常量,常量的值不能被改变 - 接口中的属性都是常量,默认由
public、static、final
以及省略修饰,abstract
不能修饰 - 属性的可见性有四种:公有的(
public
)、保护的(protected
)、默认的(default
)、私有的(private
)
五、抽象类
- 实现
Runnable
接口,接口中有一个抽象方法run
,实现类中重写该方法,且该方法是public
修饰的 abstract
可以修饰方法和类,不能修饰属性。抽象方法没有方法体,即没有大括号{}
- 抽象方法不可以是静态的,不可以有方法体,不可以在普通类中定义,可以在接口中和抽象类中定义
- 已知如下代码,下列选项中哪个表达式会编译出错( )
A.o1=o2;interface IFace{} class CFace implements IFace{} class Base{} public class ObRef extends Base{ public static void main(String argv[]){ ObRef ob = new ObRef(); Base b = new Base(); Object o1 = new Object(); IFace o2 = new CFace(); } }
B.b=ob;
C.ob=b;
D.o1=b;
【正确答案】C
【答案解析】b
是ob
的父类,将父类引用赋值给子类型变量上需要强制类型转换 - 抽象方法不可以是静态的,不可以有方法体,不可以在普通类中定义,可以在接口中和抽象类中定义
六、接口类
- Java支持单重继承,一个类只能继承自另外的一个类,但是一个类可以实现多个接口
- 在Java中,已定义两个接口
B
和C
,要定义一个实现这两个接口的类,例:class A implements B,C
- java8以前,接口只能被类实现,类不能继承接口,遵循单继承多实现原则,接口中只能定义常量和抽象方法
- java8以后,接口中可以包含静态方法和默认方法
- 接口中不可以有
private
的方法;接口中不可以有final
的方法 接口中的方法默认是public abstract
的;接口中的方法不可以有实现;接口可以继承其他接口 - 接口是一种只含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现,所以与存储空间没有任何关系
- 不能用来修饰
interface
的有( )
A.private
B.public
C.protected
D.static
【正确答案】A,C,D
【答案解析】修饰接口可以是public
和默认