继承
继承
再Java中使用extends关键字来标识两个类的继承关系。
实例:
创建两个类,Test类和Test2类,其中Test2类继承与Test类。
Test类
public class Test {
public Test()
{
System.out.println("这是Test类的无参构造方法");
}
protected void doSomething()
{
System.out.println("这是Test类的成员方法doSomething");
}
protected Test doIt()
{
System.out.println("这是Test类的成员方法doIt");
return new Test();
}
}
Test2类
public class Test2 extends Test { // 使用extends关键字表示Test2继承与Test类
public Test2()
{
super();
super.doSomething();
}
public void doSomethingnew()
{
System.out.println("这是test2的成员方法doSoemthingnew");
}
public void doSomething()
{
System.out.println("这是Test2的成员变量doSomething");
}
protected Test2 doIt()
{
return new Test2();
}
}
说明:Test类是Test2类的父类,Test2类是Test类的子类;再子类中可以连同初始化父类构造方法来完成子类初始化操作,既可以在子类的构造方法中使用super语句调用父类构造方法,也可以在子类中使用super关键字调用父类成员方法。
子类没有权限调用父类中被修饰为private 的方法和成员。子类继承父类的protected、public成员,子类可以重写父类的成员方法,可以重写成员方法的实现内容,更改成员方法的存储权限(protected->public)。注意,子类重写父类方法不能降低方法的修饰权限范围。重写的返回值类型必须是父类中同一方法返回值类型的子类。
1. 在Java继承机制中,创建一个子类对象,将包含一个父类对象,这个对象与父类创建对象是一致的。即子类实例对象创建时,会先创建其对应的父类对象,再创建子类对象实例。
2.对象类型的转换:向上转型和向下转型
Quadrangle类
class Quadrangle{
pubic static void draw(Quadrangle q)
{ //some sentence
}
}
Parallelogram类
public class Parallelogram extends Quadrangle{
public static void maim(String args){
Paralelogram p =new Parallelogram();
draw(p);
//向上转型
Quadrangle q=new Parallelogram();
q=p;
//向下转型,必须采用强制转换。
Parallelogram p1=(Parallelogram)q;
}
}
向上转型:子类对象可以直接赋值给父类对象。如: Quadrangle q=new Parallelogram();
向上转型是具体对象向抽象对象转换,不会出错,具有安全性。
向下转型:将父类对象赋值给子类对象。如: Parallelogram p1=(Parallelogram)q;
向下转型是抽象类向具体类对象转换。如果父类对象不是子类的实例,则会发生ClassCastException异常。
3.使用instanceof操作符判断对象类型
instanceof操作符的使用语法:
myobject instanceof ExampleClass
说明:
- myobject 某类的对象引用
- ExampleClass 某个类
例子:
Quadrangle q=new Quadrangle();
if(q instanceof Quadrangle) //q为实例对象的引用,Quadrangle时类的名称
System.out,println("q的类型为:Quadrangle");
关于对象类型转换的变量和方法调用:
Animal类
public class Animal {
int age=10;
public void eat(){
System.out.println("animal");
}
}
cat类
public class cat extends Animal{
int age=20;
int name=1;
@Override
public void eat() {
System.out.println("cat");
}
}
AnimalDemo类
public class AnimalDemo {
public static void main(String[] args) {
Animal a=new cat();
System.out.println(a.age);
//访问成员变量,编译执行都看左边
a.eat();
//编译看左边,运行看右边。
/*
*
* 这里声明的对象为Animal类,是父类对象,但其使用的是子类cat类来对其实例化,是向上转型,
* 在编译时,查看的是父类对象,如果父类中没有eat()方法,则会报编译错误;
* 在运行时,调用的则是用来实例化的子类cat中的eat()方法,如果子类中没有重写父类中的eat()方法,则在运行父类的eat方法。*/
}
}
如果父类中没有eat方法:

如果子类中没有重写eat方法:
这个调用语句不会报错,

但是运行时由于子类没有重写eat方法,调用的则是父类的eat方法。
重载:方法的重载仅针对于一个类中方法的名称与参数进行识别,与返回值无关。
构成方法重载的条件:
- 参数个数不同
- 参数类型不同
- 参数顺序不同
不定长参数方法
不定长方法的语法如下:
返回值 方法名(参数类型 ... 参数名称)
一个实例:
pubilc static int add(int...a)
{
int sum=0;
for(int i=0;i<a.length;i++){
s+=a[i];
return s;
}
}

浙公网安备 33010602011771号