类的继承:
在Java中,一个类只能从一个父类继承,而不能从多个类中继承。这种继承方式称为“单继承”。
在Java中,如果你定义了一个类,这个类没有继承任何父类,那么,系统会自动将这个类的父类设置为java.lang.Object,例如:
public class Person(){
…
}
//实际上等价于:
Public class Person extends java.lang.Object{
…
}
访问控制修饰符:
在Java中,虽然一个子类只能继承一个父类,但是,一个父类可以派生出多个子类。
在Java中,定义了三个修饰符来控制类,类的属性以及类的方法等的访问范围。通过这三个修饰符,可以定义四种程度的限制。
Private:这是限制最严格的一个修饰符,使用这个关键字来限制的属性或者方法,只能在同一个类中被访问。也就是说,在这个类文件之外,这些属性或方法是被隐藏的。这个修饰符最常用于修饰类中的全局变量。注意,这个修饰符不能用在类的前面。
Protected:protected修饰符修饰的属性或方法,可以被同一个类、同一个包中的类以及子类访问。注意:这个修饰符同样不能用于类前面。
Public:这个修饰符对类、类的属性以及类的方法均可用。它的限制是最宽松的,使用这个修饰符修饰的类属性、类的方法可以被任何其他的类访问,无论这个类是否在同一个包中,以及是否为子类等。
Default:default不是关键字,只是对类、类的属性和方法的访问权限的一种称呼。如果在类、类的属性和方法前面没有添加任何的修饰符,则访问权限为default。此时,只有类本身或者同一个包中的其他类可以访问这些属性或方法。
一般来说,我们应该将和其他类无关的属性或者方法设置为private,只有需要将它给其他的类访问的属性或方法才将它设置为public或者protected,或者不加任何修饰符,让其为default。
方法的覆盖:
当一个子类继承了一个父类时,它也同时继承了父类的属性和方法,如果不满足子类的需求,子类可以对父类的方法进行覆盖(Override)。覆盖过程中,需要提供和父类中被覆盖方法相同的方法名称、输入参数以及返回类型。另外,不能使用比父类中的被覆盖方法更严格的访问权限。
Super关键字
Super的作用是引用父类的成员,例如属性、方法或者是构造器。
父类必须自己负责初始化它自己的状态而不是让子类来做,因此,如果子类的构造器中没有显示地调用父类构造器,也没有在构造器中调用重载的其他构造器,则系统将会默认调用父类中无参数的构造器。此时,如果父类中没有无参数的构造器,则编译将会报错。
父类的属性或方法必须是那些protected或者public等可以让子类中访问的属性或者方法。
方法重载:
在进行方法的重载时,有四条基本原则需要遵守:
1、 方法名相同;
2、 参数列表必须不同;
3、 返回值可以不同;
4、 可以互相调用
方法的返回值不是方法的签名的一部分,所以,进行方法的重载的时候,不能将返回值类型的不同当成两个方法的区别。也就是说,在同一个类中,不能有这样的两个方法,它们的方法名相同、参数相同,只是方法的返回值类型不同。
构造器重载:
它没有返回值,它的方法名称必须和类的名称一致。构造器可以进行重载。
This关键字:
Java中为解决变量的命名冲突和不确定性问题,引入关键字“this”代表其所在方法的当前对象:
1、 构造器中指该构造器所创建的新对象;
2、 方法中指调用该方法的对象;
3、 在类本身的方法或构造器中引用该类的实例变量和方法。
public class person{
private String name;
private String address;
public preson(){
};
public preson(String name){
this(); //调用构造器person();
this.name = name;
}
public person(String name, String address){
this(name); //调用构造器person(String name);
this.address = address;
}
}
This只能用在构造器或者方法中,用于获得调用当前的构造器、方法的对象引用。可以和任何的对象引用一样来对处理这个this对象。在构造器中可以通过this()方式来调用其他的构造器,但在一个构造器中最多只能调用一次其他的构造器。并且,对其他构造器的调用动作必须在构造器的起始处,否则编译会出错。不能在构造器以外的地方以这种方式调用构造器。
Static关键字:
在Java中,可以将一些成员限制为和类相关的,而不是和实例相关的。实现这个目的的方法是,在类的成员例如方法、属性乃至自由代码块前面加上static修饰符。
Static不可用于修饰构造器。
Final关键字:
在Java的类、方法和变量前面,可以加上final关键字。Final关键字表示它修饰的类、方法或变量不可被改变。Final类不可以被继承,final变量表示该变量不可以被改变,就是常量。
Final方法表示这个方法不可以在子类中覆盖。
public class A{
public final void fun1(){
}
}
public class B extends A{
//此处报错,因为它试图覆盖父类中的静态方法
public void fun1(){
}
}
/*********************************/
public class A{
private final void fun1(){
}
}
public class B extends A{
//此处不报错,因为B无法访问A中的fun1(),所以这里只是新定义了一个fun1()
public void fun1(){
}
}
抽象类:
Abstract:抽象类里面并非一定需要抽象方法,当定义了一个类但是又不想让它被直接实例化的时候,可以使用抽象类的方法来实现。反之,如果类中有抽象方法,则一定要将类定义为抽象的类。
在以下任一条件成立时,类必须定义成抽象类:
1、 类中有至少一个抽象方法;
2、 类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现;
3、 类实现了某个接口,但没有全部实现接口中的方法。
接口:
接口是方法声明和常量值的定义的集合。
在抽象类中,有些方法被实现,而有些方法只是方法的声明,没有方法的具体实现(抽象方法),而在接口中,所有的方法都没有被实现。
接口和抽象类的区别:
1、和抽象类中的抽象方法不一样,这些没有被实现的方法不需要加上关键字abstract来将它声明为抽象方法。
2、接口中所有成员属性都会被自动加上publicstatic final来修饰,所有方法都会加上public来修饰。
3、接口的继承也是使用extends关键字,接口的使用用implements。和类的继承不同的是,在接口的继承中可以继承多个接口,只需要将继承的各个接口用逗号隔开即可。
Java不支持多继承,但是一个类可以实现多个接口,通过接口可以模拟实现多继承。
多态:
在Java中,对象变量是多态的。一个类型为Aclass的变量既可以指向类型为Aclass的对象,也可以指向Aclass的任何子类对象。
多态带来的一个明显的好处是:以多态的形式来传递参数,增强了参数类型的灵活性。
Instanceof运算符:
<引用类型变量> instanceof<引用类型>
这是一个boolean类型的表达式,当instanceof左侧的引用类型变量所引用对象的实际类型是其右侧给出的类型或其子类类型时,整个表达式的结果为true,否则为false。
内部类:
内部类就是定义在一个类内部的类。
1、 内部类对象能访问它所处类的私有数据;
2、 内部类能够隐藏起来不为同一个包中的其他类访问;
3、 匿名内部类可以方便地用在回调方法中。