继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为,是一种“is a”的关系,即子类是对父类的拓展,是一种特殊的父类,比如:狗是动物的一种特殊情况,狗属于动物。
extends关键字:
实现继承的关键字,java中是单一继承,正如一个人只有一个亲生父母,所以extends 后只能继承一个类
也就是说一个类A,只能有一个直接的父类,不能出现类A同时继承于类B和类C, 但是,Java中允许多重继承.
多重继承例子:
动物有胎生动物和卵生动物之分,胎生动物有老虎,老虎又分华南虎,东北虎,孟加拉虎等。
格式:
public class 子类类名 extends 父类类名
{
编写自己特有的状态和行为
}
子类到底继承了父类的哪些成员(根据访问修饰符来判断):
1):如果父类中的成员使用public修饰,子类继承.
2):如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中.
3):如果父类和子类在同一个包中,此时子类可以继承父类中 缺省修饰符的成员.
4):如果父类中的成员使用private修饰,子类无论如何都继承不到.因为private只能在本类中访问.
5):父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同.
举个例子:
package Test;
import java.util.Arrays;
/**
*
* @author FYDragon
*
*/
class Animal {
private String name;
private int age;
public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(this.name+"正在吃");
}
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;
}
}
class Dog extends Animal {
private String name;
private int age;
private String kind;
public Dog(String name, int age,String kind) {
super(name,age);
this.kind = kind;
}
public void eat(){
System.out.println("我叫"+super.getName()+",今年"+super.getAge()+"岁啦,我在吃骨头");
}
public void say(){
System.out.println("我是一只"+this.kind);
}
}
public class TestDemo {
public static void main(String[] args) {
Dog dog = new Dog("来福", 2,"哈士奇");
dog.eat();
dog.say();
}
}
分析:animal是父类,父类中定义了名字年龄两个私有变量、构造方法和定义的方法,Dog类是子类,定义了两个私有的属性和一个种类属性,但是Dog类的构造方法中,name 和 age 是super(调用父类)的私有变量,所以在使用的时候,需要调用get和set方法来进行使用,结果如下。
Super与This关键字:
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
注意:
(1)在创建子类对象之前,会先创建父类对象.
调用子类构造器之前,在子类构造器中会先调用父类的构造器,(默认调用的是父类无参数构造器)
(2) 如果父类不存在可以被子类访问的构造器,则不能存在子类.
(3)如果父类没有提供无参数构造器,此时子类必须显示通过super语句去调用父类带参数的构造器.
super关键字的使用场景:
(1)可以使用super解决子类隐藏了父类的字段情况.该情况,我们一般不讨论,因为破坏封装.
(2)在子类方法中,调用父类被覆盖的方法,引出super的例子,此时必须使用super.
(3)在子类构造器中,调用父类构造器,此时必须使用super语句:super([实参]).
什么是this:
表示当前对象,什么优势当前对象.
this主要存在于两个位置:
构造器中: 就表示当前创建的对象.
方法中: 哪一个对象调用this所在的方法,那么此时this就表示哪一个对象.
使用this:
(1)解决成员变量和参数(局部变量)之间的二义性,必须使用;
(2)同类中实例方法间互调(此时可以省略this,但是不建议省略)。
(3)将this作为参数传递给另一个方法;
(4)将this作为方法的返回值(链式方法编程);
(5)构造器重载的互调,this([参数])必须写在构造方法第一行;
(6)static不能和this一起使用;
因此我们就引出了static关键字。
static关键字:
修饰属性:
这个属性,就不是对象的属性了。属于类的属性。(是共有的资源)
任何对象都可访问。
静态属性存在方法区中,只有一份。
修饰方法:
方法也是被加载到方法区内的,也是属于类的方法,不是对象的。
建议:使用类名进行调用
不能直接访问非静态的属性和非静态的方法。
修饰代码块:
static{
代码内容
}
修饰的代码块,只执行一次,在加载期间。执行时间在创建对象之前。一般用来假加载静态资源。
final关键字:
修饰属性:
只能声明时赋值,或者在构造器中赋值
不能再重新被赋值(只能赋一次值)
修饰方法:
使用final修饰的方法不能被子类重写。
为避免子类不经意间重写了这个方法,用final修饰。
修饰类:
不能被继承,不能存在子类。
String类型就是final修饰的类。