| 
			
	
	
	
						  
						
						
						
	
 
	本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
	 
			 
	13分30秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 步骤 1 : 准备一个显式提供无参构造方法的父类 步骤 2 : 实例化子类,父类的构造方法一定会被调用 步骤 3 : 父类显式提供两个构造方法 步骤 4 : 子类显式调用父类带参构造方法 步骤 5 : 调用父类属性 步骤 6 : 调用父类方法 步骤 7 : 练习-super 步骤 8 : 答案-super 
					准备显式提供无参构造方法的父类
 
					
				在实例化Hero对象的时候,其构造方法会打印 “Hero的构造方法 " package charactor;
import property.Item;
public class Hero {
       
    String name; //姓名
       
    float hp; //血量
       
    float armor; //护甲
       
    int moveSpeed; //移动速度
    
    public void useItem(Item i){
    	System.out.println("hero use item");
    	i.effect();
    }
    
    public Hero(){
    	System.out.println("Hero的构造方法 ");
    }
    
    public static void main(String[] args) {
		new Hero();
	}
     
}
 
								
										
									
								
							
					实例化一个ADHero(), 其构造方法会被调用
 
					
				其父类的构造方法也会被调用 并且是父类构造方法先调用 子类构造方法会默认调用父类的 无参的构造方法 package charactor;
 
public class ADHero extends Hero implements AD{
 
    @Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
    
    public ADHero(){
    	
    	System.out.println("AD Hero的构造方法");
    }
    
    public static void main(String[] args) {
    	new ADHero();
    	
    }
 
}
 
								
										
									
								
							
					分别是无参的构造方法和带一个参数的构造方法
					 
					
				package charactor;
import property.Item;
public class Hero {
       
    String name; //姓名
       
    float hp; //血量
       
    float armor; //护甲
       
    int moveSpeed; //移动速度
    
    public void useItem(Item i){
    	System.out.println("hero use item");
    	i.effect();
    }    
    
    public Hero(){
    	System.out.println("Hero的无参的构造方法 ");
    }
    
    public Hero(String name){
    	System.out.println("Hero的有一个参数的构造方法 ");
    	this.name = name;
    }
    
    public static void main(String[] args) {
		new Hero();
	}
     
}
 
								
										
									
								
							
					使用关键字super 显式调用父类带参的构造方法
					 
					
				package charactor;
 
public class ADHero extends Hero implements AD{
 
    @Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
    
    public ADHero(String name){
    	super(name);
    	System.out.println("AD Hero的构造方法");
    }
    
    public static void main(String[] args) {
    	new ADHero("德莱文");
    }
 
}
 
									
								package charactor;
 
public class ADHero extends Hero implements AD{
 
    @Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
    
    public ADHero(String name){
    	super(name);
    	System.out.println("AD Hero的构造方法");
    }
    
    public static void main(String[] args) {
    	new ADHero("德莱文");
    }
 
}
								
								
					通过super调用父类的moveSpeed属性 
					
				ADHero也提供了属性moveSpeed public int getMoveSpeed(){ return this.moveSpeed; } public int getMoveSpeed2(){ return super.moveSpeed; } package charactor;
 
public class ADHero extends Hero implements AD{
    int moveSpeed=400; //移动速度
    @Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
    
    public int getMoveSpeed(){
    	return this.moveSpeed;
    }
    
    public int getMoveSpeed2(){
    	return super.moveSpeed;
    }
    
    public static void main(String[] args) {
    	ADHero h= new ADHero();
    	
    	System.out.println(h.getMoveSpeed());
    	System.out.println(h.getMoveSpeed2());
    	
    }
 
}
 
								
										
									
								
							
					ADHero重写了useItem方法,并且在useItem中通过super调用父类的useItem方法
					 
					
				package charactor;
import property.Item;
import property.LifePotion;
public class ADHero extends Hero implements AD {
	int moveSpeed = 400; // 移动速度
	@Override
	public void physicAttack() {
		System.out.println("进行物理攻击");
	}
	public int getMoveSpeed() {
		return this.moveSpeed;
	}
	public int getMoveSpeed2() {
		return super.moveSpeed;
	}
	// 重写useItem,并在其中调用父类的userItem方法
	public void useItem(Item i) {
		System.out.println("adhero use item");
		super.useItem(i);
	}
	public static void main(String[] args) {
		ADHero h = new ADHero();
		LifePotion lp = new LifePotion();
	}
}
 
								
										
									
								
							
					父类Hero提供了一个有参的构造方法: 
					
				public Hero(String name){ this.name = name; } 但是没有提供无参的构造方法 子类应该怎么处理? package charactor;
  
public class Hero {
    public String name; 
    protected float hp; 
  
    public Hero(String name){
    	this.name = name;
    }
    
//    故意不提供无参的构造方法
//    public Hero(){
//    	
//    }
    
    public static void main(String[] args) {
    
	}
      
}
 
									
								package charactor;
  
public class Hero {
    public String name; 
    protected float hp; 
  
    public Hero(String name){
    	this.name = name;
    }
    
//    故意不提供无参的构造方法
//    public Hero(){
//    	
//    }
    
    public static void main(String[] args) {
    
	}
      
}
								
								
				
										
				在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
			 
					
			
		
	
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
 
	
	
	 
	1分30秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 
					作为子类,无论如何 都会调用父类的构造方法。 
					
				默认情况下,会调用父类的无参的构造方法。 但是,当父类没有无参构造方法的时候( 提供了有参构造方法,并且不显示提供无参构造方法),子类就会抛出异常,因为它尝试去调用父类的无参构造方法。 这个时候,必须通过super去调用父类声明的、存在的、有参的构造方法 package charactor;
  
public class ADHero extends Hero implements AD{
    public ADHero() {
		super("");
	}
	@Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
}
 
									
								package charactor;
  
public class ADHero extends Hero implements AD{
    public ADHero() {
		super("");
	}
	@Override
    public void physicAttack() {
        System.out.println("进行物理攻击");
    }
}
								
								
				HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
			 
			 
			
			
			
			
			
		
		
		
		 	问答区域     
		 	
				
		  
	 
	  		
	  
	  	2023-12-03
	  		
	  				
	  					 
	  
					
						总结 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  
 
2 个答案 
	 
1563590a 跳转到问题位置 答案时间:2025-01-23 答:
会报错
因为已经提供了hero的有参构造方法
Java不会再次提供一个默认的无参构造方法 
		
							
		
		
		
		
	
		
		hncj指尖风雨 跳转到问题位置 答案时间:2023-12-29 总结:super()调用父类的无参构造方法,super(参数)调用父类的有参构造方法,super().方法名调用父类的普通构造方法 
		
							
		
		
		
		
	
	
	
		回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢	
	 
	  		
	  
	  	2023-05-17
	  		
	  				
	  					 
	  
					
						子类显式调用父类带参构造方法有什么用? 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  
 
1 个答案 
	 
tkc030526 跳转到问题位置 答案时间:2023-08-06  Java中,如果子类没有显式调用super()来调用父类的构造方法,系统会自动添加一个默认的super()调用,调用父类的无参构造方法。
但是在某些情况下,子类需要调用父类的有参构造方法来完成初始化。这时就需要在子类的构造方法中用super(参数) explicitly调用父类的有参构造方法。
调用父类有参构造方法的主要目的是:
1. 子类需要使用父类初始化的一些资源,这些资源只在父类的有参构造方法中被初始化。
2. 父类没有无参的构造方法,必须通过有参构造方法来完成实例化。
3. 父类的某些属性必须通过有参构造方法来初始化,子类继承了这些属性也需要初始化。
4. 父类的无参构造方法没有完成全部初始化,子类需要调用有参构造方法来完整初始化。
所以,当父类的无参构造方法无法满足子类的初始化需求时,子类就需要通过super(参数)调用父类的有参构造方法,这是使用super()的主要目的。 
		
							
		
		
		
		
	
	
	
		回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢	
	 
	  		
	  
	  	2022-05-10
	  		
	  				
	  					 
	  
					
						答案 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  
	  		
	  
	  	2022-05-06
	  		
	  				
	  					 
	  
					
						我的eclipse子类方法不能用super调用父类方法 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  
	  		
	  
	  	2022-05-06
	  		
	  				
	  					 
	  
					
						仅供参考 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 47 条以前的提问,请 点击查看 
			
			提问之前请登陆
			
		 
		提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢	
	 
 |