Java继承的基本操作

时间:2021-05-09作者:klpeng分类:IT综合浏览:352评论:0

 

1.继承的基本内容:

       给定一个Father类,如果我想要另一个Son类获得Father类中的非private的属性和方法(同包下),我们就可以使用继承。继承所需要的关键字是extends 在所需要要继承的类声明后面加上extends 需要继承的类名。我们给要继承的类Son类起名为子类 ,给被继承类Father类起名为父类或者超类。

public class Father {
	
}
class Son extends Father{
	
}

继承的格式是  class 子类名  extends  父类{  }

这样的话,Son类就可以继承到了Father类中定义的方法和属性,现在Father给Son留了一笔私有钱,Son类不加任何修改,Son是可以知道这笔钱的。也就是说Son 类继承了Father类的话,Son类里面有Father类里面的非private的属性和方法。

public class Father {
	private int Price = 10000;
	int getPrice() {
		return Price;
	}
	public static void main(String[]args) {
		Son s =new Son();
        
		System.out.println(s.getPrice()); //输出10000
		
	}
	
}
class Son extends Father{

}

当我们要通过子类调用父类的private的变量的时候,系统就会报错,因为private是本类专有的,被继承之后,子类访问不到。

Java继承的基本操作

当然,对于说子类继承父类,子类继承了父类的非private的属性和方法只是在当子类和父类定义在同一个包中(非private的权限修饰符为public ,protected,什么都没有)。如果子类和父类在不同包内,那么子类继承父类,子类只能继承父类中的public,protected修饰的属性和方法。因为访问权限修饰符的访问权限的影响对于继承也同样适用。继承下来的方法和属性跟父类的权限修饰符不会变。

假设,父类和子类中出现了相同名的属性,我该如何在子类访问父类的属性 ,格式是  super.属性名。很像当成员变量名和传入参数名一样时,访问成员变量的话就是 this.成员变量名。并且通过super.成员变量名可以修改父类的初始化变量的值。


public class Father {
	
	public Father() {
		
	}
	public int Price = 10000;
	int getPrice() {
		return Price;
	}
	public static void main(String[]args) {
		Son s =new Son();
		s.getSonPrice();
		//System.out.println(s.Price);
		
	}
	
}
class Son extends Father{
	int Price=0;
	public Son() {
		
	}
	void getSonPrice() {
		int Price = 1;
		System.out.println("子类的成员变量:"+this.Price);
		System.out.println("父类的成员变量:"+super.Price);
		System.out.println("局部变量:"+Price);
		
	}
}

输出结果为:

Java继承的基本操作

那假如子类的方法名和父类的方法名一样,权限修饰符,返回值都一样。那么这就是覆盖重写。了解java中的覆盖重写 

覆盖重写就是当子类调用跟父类名字一样的方法时,会调用子类里面定义的方法而不去调用父类的方法了。


public class Father {
	
	public Father() {
		
	}
	public int Price = 10000;
	int getPrice() {
		return Price;
	}
	void printPrice() {
		System.out.println("父类的钱:"+this.Price);
	}
	public static void main(String[]args) {
		Son s =new Son();
		//s.getSonPrice();
		//System.out.println("子类的Price:"+s.Price);
		s.printPrice();
	}
	
}
class Son extends Father{
	int Price=0;
	public Son() {
		
	}
	void getSonPrice() {
		int Price = 1;
		System.out.println("子类的成员变量:"+this.Price);
		System.out.println("父类的成员变量:"+super.Price);
		System.out.println("局部变量:"+Price);
		
	}
	int getPrice() {
		return this.Price;
	}
	void printPrice() {
		System.out.println("子类的钱:"+this.Price);
	}
}

输出结果:

Java继承的基本操作

如何通过子类初始化父类,因为子类无法继承父类的构造函数,如果我们要调用父类构造函数的话就需要在子类构造函数的添加super()或者super(Fathername)。如果有参数,在()里面传入,当然()里面的数值的多少就是对应父类重载构造函数,首先父类一定要有重载构造函数。并且还是最好每个类中提供一个无参构造函数,因为重载构造函数之后,编译器默认给出的无参构造函数就会消失没有,很容易就会使用报错。

如果子类继承父类,子类调用构造函数时,是首先调用了父类构造函数,在调用子类的构造函数进行初始化的。所以如果使用了super(),必须要放在子类构造函数的第一行。且super()和this()不可以连用,因为这样子的话就会调用两次父类构造函数。

 

下面是在子类构造函数初始化了父类的姓名和本类的姓名。

public class Father {
	String name;
	public Father(String name) {
		System.out.println("我是父类重载构造函数");
		this.name = name;
	}
	public Father() {
		
		System.out.println("我是父类构造函数");
	}
	public int Price = 10000;
	int getPrice() {
		return Price;
	}
	void printPrice() {
		System.out.println("父类的钱:"+this.Price);
	}
	public static void main(String[]args) {
		Son s =new Son();
		//s.getSonPrice();
		//System.out.println("子类的Price:"+s.Price);
		//s.printPrice();
		s.printName();
		System.out.println("=========");
		s = new Son("马1","马2");
		s.printName();
	}
	
}
class Son extends Father{
	int Price=0;
	String Myname;
	public Son(String Fathername,String Myname) {
		
		super(Fathername);
		
		this.Myname = Myname;
		
		System.out.println("我是子类重载构造函数");
		
	}
	public Son() {
		this("小头爸爸","大头儿子");
		System.out.println("我是子类构造函数");
	}
	void getSonPrice() {
		int Price = 1;
		System.out.println("子类的成员变量:"+this.Price);
		System.out.println("父类的成员变量:"+super.Price);
		System.out.println("局部变量:"+Price);
		
	}
	int getPrice() {
		return this.Price;
	}
	void printPrice() {
		System.out.println("子类的钱:"+this.Price);
	}
	void printName() {
		System.out.println("我的爸爸叫:"+super.name);
		System.out.println("我的名字叫:"+this.Myname);
	}
}

输出结果:

Java继承的基本操作

2.继承的扩展:

 (1)另外,如果子类中有成员对象的构造函数的话,该构造函数会优于子类的构造函数调用。

     也就是说在子类中构造函数的调用次序为:父类构造函数 > 成员对象的构造函数 >子类构造函数

public class Test { 
	public static void main(String[]args) {
		Son son = new Son();	
	}
	
}
class Father {

	Father(){
		System.out.println("父类的构造函数");
	}
    
}
class Son extends Father{
	 S s = new S();
	 Son(){
		 System.out.println("子类的构造函数");
	 }
}
class S{
	S(){
		System.out.println("成员对象的构造函数");
	}
}

输出结果为:

Java继承的基本操作

(2)提及一点多态,父类引用指向子类对象(向上转型)父类引用可以调用子类覆盖重写的方法而不可以调用子类特有的方法。

package com.java.inherit;

public class Father {
	String name;
	public Father(String name) {
		System.out.println("我是父类重载构造函数");
		this.name = name;
	}
	public Father() {
		
		System.out.println("我是父类构造函数");
	}
	public int Price = 10000;
	int getPrice() {
		return Price;
	}
	void printPrice() {
		System.out.println("父类的钱:"+this.Price);
	}
	public static void main(String[]args) {
		//Son s =new Son();
		//s.getSonPrice();
		//System.out.println("子类的Price:"+s.Price);
		//s.printPrice();
		//s.printName();
		//System.out.println("=========");
		//s = new Son("马1","马2");
		//s.printName();
		Father f1 = new Son();
		f1.printPrice();
	}
	
}
class Son extends Father{
	int Price=0;
	String Myname;
	public Son(String Fathername,String Myname) {
		
		super(Fathername);
		
		this.Myname = Myname;
		
		System.out.println("我是子类重载构造函数");
		
	}
	public Son() {
		this("小头爸爸","大头儿子");
		System.out.println("我是子类构造函数");
	}
	void getSonPrice() {
		int Price = 1;
		System.out.println("子类的成员变量:"+this.Price);
		System.out.println("父类的成员变量:"+super.Price);
		System.out.println("局部变量:"+Price);
		
	}
	int getPrice() {
		return this.Price;
	}
	void printPrice() {
		System.out.println("子类的钱:"+this.Price);
	}
	void printName() {
		System.out.println("我的爸爸叫:"+super.name);
		System.out.println("我的名字叫:"+this.Myname);
	}
}

输出结果:

Java继承的基本操作

 

3.总结:

1,java仅支持单继承,一个类最多只能继承一个类。

2.  继承子类创建对象时,是先调用父类构造函数然后在调用子类构造函数。子类构造函数往往是最后一个调用的。并且子类默认继承父类无参构造函数。

3. 子类构造函数中如果要用super(参数)初始化父类成员变量,就必须放在且只能放在构造函数第一行,并且不能与this()构造连用。

4.子类调用父类成员变量(方法)的方式为:  super.成员变量名(方法)。

5.父类引用指向子类对象时,引用只能调用子类覆盖重写的方法。

6.子类父类同包下,子类继承父类非private的属性(方法),所对应的权限修饰符不变。不同包下,子类只能继承public ,protected的变量和方法。

 

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢