Java笔记整理 —— 继承

继承

基本介绍

    继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可

示意图

基本语法

class 子类 extends 父类{}

1. 子类会自动拥有父类定义的属性和方法(当然受访问修饰符的限制)。

2. 父类又叫超类,基类。

3. 子类又叫派生类。

4. 假设A继承B,B继承C,那么C也算A的父类。

注意事项

1. 子类继承了父类所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

2. 子类必须调用父类的构造器,完成父类的初始化。

3. 当创造子类对象时,不管使用子类哪个构造器,默认情况下都会去调用父类的无参构造器,相当于子类的构造器有一个默认语句 super()

public class Pupil extends Person{
     double score;
     Pupil(){
         System.out.println("调用pupil构造器");
     }

    public static void main(String[] args) {
        Pupil pupil = new Pupil();   // 调用子类Pupil的构造器
    }
}

 发现首先调用的是父类的构造器,然后再调用子类的构造器。

4. 如果父类没有提供无参构造器,则必须在子类的构造器中用super指定使用父类的某个构造器完成对父类的初始化工作,否则编译不会通过

    Person(int age,String name){  //父类的构造函数,有参数
        this.age = age;
        this.name = name;
    }


public class Pupil extends Person{  //继承的子类
     double score;
     Pupil(){
         System.out.println("调用pupil构造器");
     }  

    public static void main(String[] args) {
        Pupil pupil = new Pupil();   //直接报错,因为没有调用父类的构造器
    } 
}    

     Pupil(){
         super(10,"wang");
         System.out.println("调用pupil构造器");
     }   //正确,用super调用父类构造器

5. 如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)。

6. super在使用时,必须放在构造器第一行( super() 调用构造器这种方法只能在构造器中使用)

     Pupil(){
         System.out.println("调用pupil构造器");
         super(10,"wang");   //报错,super调用构造器必须放在第一行
     }

7. super() 和 this() 都是调用构造器的方法,都必须放在构造器的第一行,因此这两个方法不能共存在一个构造器

8. Java中所有类都是Object类的子类(可以用ctrl + H查看)。

9. 调用子类构造器时,会向上一直调用父类的构造器,一直追溯到Object类。

    public static void main(String[] args) {
        Pupil pupil = new Pupil();  //从上往下开始调用构造器
    }

10. 子类最多只能继承一个父类(直接继承,删除了C++的多重继承),Java中是但继承机制。那么任何让A类同时继承B类和C类? A 继承 B,B 继承 C。 

11. 不能滥用继承,子类和父类之间必须满足 “is - a”(也就是必须有共同点)的逻辑关系。

Music extends Person //不合理
Cat extends Animal //合理

本质分析

分析当子类继承父类,创建子类对象时,内存中到底发生了什么。

Son son = new Son();
System.out.println(son.name);  //本类中有该信息,返回 "小头儿子"
System.out.println(son.age);   //父类中有该信息,返回 39
System.out.println(son.hobby); //父类的父类有该信息,返回 "旅游"

要按照查找关系来返回信息

     1. 首先看子类是否有该属性,如果子类有这个属性,则返回信息(因为是在本类中,因此绝对可以访问,即使是private)

     2. 如果子类没有这个属性,就看父类有没有这个属性,如果父类有该属性,并且可以访问,就返回信息,如果该信息不可访问(private),那么就直接报错(can not access),不会再向上查找了

     3. 如果父类没有该信息,那么就按照 (2) 的规则,继续找上级,直到Object,如果到最顶端也没有查找到,则提示该方法不存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值