菜吉吉java学习中——继承与接口

  继承这个词我们在平时生活中也是经常遇到的~~子一代继承父辈的遗产,或者继承什么什么的传统等等。~那现在用一段代码来看看java中的继承是什么意思的吧~

 

 

//定义一个学生类
public class Student{
	//定义学生的属性
           private String name = "XiaoYZ";
	public int age;
	//定义学生可以做的一些方法 
	public void study(){
		System.out.println(name+"学生在学习");
	}  
	public void play(){
		System.out.println(name+"学生在玩儿");
	}
}

 

 

//再定义一个大学生类

public class UnStudent extends Student{
	public void dota{
	System.out.println(name+"大学生在打dota");
	}	
	public void play(){
		System.out.println(name+"大学生在玩游戏");
	}
}

 

其实通过这两段代码就可以弄明白继承这种关系了。可以看出,学生是一个较大的范围,而大学生则是学生中的一类,可以说是学生类包含大学生类,大学生类包含于学生类。这样,我们再构建大学生类的时候,使用了extends这个关键字,用来继承Student这个类。这样做便达到了继承学生类的目的。那么都可以继承些什么呢?。我们再写一段Test代码来检测一下。

 

//定义一个Test类用作测试继承的效果
public class Test{
public static void main(String args[]){
//定义一个大学生类的对象stu,并执行一定操作
UnStudent stu = new UnStudent();
stu.age = 20;
stu.study();
stu.play();
stu.dota();

//再定义一个学生类的对象
Studen stu1 = new UnStudent();
stu1.study();
sut1.play();
stu1.dota();
}
}

 

这个代码编译肯定不会通过。因为我们要弄懂继承都可以继承什么。子类可以继承父类所有的非私有的属性和方法。所以刚才我们student类的name属性我们定义为private。那么在UnStudent这个大学生类中既然继承了Study和Play这两个方法,但调用他们的时候需要name这个属性,所以会报错。同时,大学生类里面定义的dota()方法和play()方法也会有同样的报错。

另外我们也会看到,在父类中已经定义了一个play()的方法,但在子类UnStudent中又出现了一个重新定义的played()的方法。这样是否矛盾呢,答案是否定的。这种情况是方法的重写。所以在Test中我们建立一个大学生类的对象stu调用stu.play()这时输出的是“大学生在玩游戏”。

在Test中还有另一个对象,stu1。这个对象是学生类的,但用的是大学生类的构造方法。这是就会出现一种自动转型的情况。就是从范围比较小的类自动转换为范围比较大的类。因此这个stu1是Student类型的对象,所以执行play()输出会是“学生在玩儿”。而执行dota(),则会报错。因为dota()这个方法是UnStudent才可以执行的。

我们还可以看到,同样都是执行play()这个方法,stu和stu1两个对象执行出的结果是不同的。这就是多态的实现。

可以说:正是因为有了继承,之后才会有方法的重写。

            正式因为有了方法的重写,才会出现多态。

 

 

接着再对接口进行一个小小的总结吧。

其实接口和继承是有些相似的。有的时候我们创建一个类,可能那个类的属性或者是方法我们无法去描述。因为一个类如果范围越大那么这个类中对象的共同点就会越少。所以我们可以用一种模糊的方式来创建一个类,也就是接口interface。

 

/**
 * 定义一个人类的接口
 * @author 肖一喆
 *
 */
public interface People {
	public static final String name1= "xyz";
	
	//定义人类接口的方法
	public abstract void play();
	public abstract void study();
	public abstract void sleep();
}

 从这个代码可以看出,我们定义这个接口是有一定要求的。首先属性必须是public,static,final。就是必须是一个常量。还有再定义方法的时候我们不用把每一个方法的内容给写出来,可以像是c语言里面的函数的声明一样。但当我们去实现这个接口的时候,则需要把他的所有方法给定义好。

 

/**
 * 定义一个大学生类
 * 
 * @author 肖一喆
 *
 */
public class UnStudent implements People{
	public int age = 19;
	
	public void study(){
		System.out.println(name1+"大学生在学习");
	}
	
	public void sleep(){
		System.out.println(name1+"大学生在睡觉");
		
	}
	
	public void play(){
		System.out.println(age+"大学生在玩儿");
		
	}

 就像这样。我们用大学生这个类来implements People这个接口,就要在UnStudent中把People中的方法给写好。

 

 

我们在来看几段代码,就可以把继承和接口的一些关系给弄明白了。

 

首先就是定义一个People的接口。

/**
 * 定义一个人类的接口
 * @author 肖一喆
 *
 */
public interface People {
	public static final String name1= "xyz";
	
	//定义人类接口的方法
	

	public abstract void play();
	public abstract void study();
	public abstract void sleep();
}

 
之后再定义一个Student的接口

 

/**
 * 定义一个学生的接口
 * @author 肖一喆
 *
 */

public interface Student {
	//定义接口的属性
	public static final String name = "XiaoYZ";
	
	//定义接口的方法
	public abstract void study();
	public abstract void sleep();
	
	
	
}

 

再创建一个大学生类

 

/**
 * 定义一个大学生类
 * 一个class实现多个interface
 * @author 肖一喆
 *
 */
public class UnStudent implements Student,People{
	public int age = 19;
	
	public void study(){
		System.out.println(name+"大学生在学习");
	}
	
	public void sleep(){
		System.out.println(name1+"大学生在睡觉");
		
	}
	
	public void play(){
		System.out.println(age+"大学生在玩儿");
		
	}	
	
}

  从这里我们就能看出一点。就是:一个class可以implements多个interface。这里UnStudent这个类即实现了Student这个接口,又实现了People这个接口。但我们也发现People和Student这两个接口中,存在两个同名字的方法,都有sleep()y和study()这两方法,但这并不影响。因为我们在用UnStudent这个类实现这两个接口的时候需要给方法写全,在这里只要给他们写完整就可以的!

 

在这里我们再定义一个接口

 

/**
 * 定义一个中南大学学生接口
 * 一个interface继承多个interface
 * @author 肖一喆
 *
 */
public interface CSUstu extends Student,People{
	
	public abstract void rest();	
}

 我们就可以看出这里是一个CSUstu的接口继承了Student,People这两个接口。

 

最后还有一种情况就是:一个class可以extends一个class并且再去implements多个interface。

/**
 * 创建一个中南大学学生的类
 * 一个class只能继承一个class,可以实现多个interface
 * @author 肖一喆
 *
 */
public class CSUstu1 extends UnStudent implements CSUstu,People{
	
	public void rest(){
		System.out.println("中南大学学生在休息");
		
	}
	
	
}

 

这里可以看出因为CSUstu1这个类所继承的那个Unstudent类已经把People中的方法给补全了,所以不用再重新补全People中方法。但需要补全CSUstu中的rest()方法。

 

总结起来可以有如下几点:

1.一个class只能extends一个class(单根继承)

2.一个class可以implements多个interface

3. 一个interface可以extends多个interface

4.一个class可以在extends一个class的基础上再去implements多个interface

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Java实现文件上传的代码: ```java import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/upload") @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB maxFileSize = 1024 * 1024 * 10, // 10MB maxRequestSize = 1024 * 1024 * 50) // 50MB public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传文件的保存目录 String savePath = request.getServletContext().getRealPath("/WEB-INF/upload"); // 如果目录不存在,需要创建目录 File file = new File(savePath); if (!file.exists() && !file.isDirectory()) { System.out.println("目录不存在,需要创建目录:" + savePath); file.mkdir(); } // 获取上传的文件集合 List<Part> parts = (List<Part>) request.getParts(); for (Part part : parts) { // 获取上传文件的名称 String fileName = part.getSubmittedFileName(); // 将文件保存到服务器 part.write(savePath + File.separator + fileName); } response.getWriter().println("文件上传成功!"); } } ``` 这是一个基于Servlet 3.0规范的文件上传接口,使用了注解`@MultipartConfig`来指定上传文件的大小限制和保存目录。在`doPost`方法,首先获取上传文件的保存目录,然后通过`request.getParts()`方法获取上传的文件集合,遍历集合将每个文件保存到服务器。最后返回上传成功的提示信息。 需要注意的是,该代码保存文件的目录路径是相对于Web应用根目录的,需要根据实际情况进行修改。另外,该代码仅供参考,具体实现需要根据业务需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值