IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> [Java]类的封装、继承、多态 -> 正文阅读

[PHP知识库][Java]类的封装、继承、多态

封装

封装指的是将类的复杂的细节隐藏起来,只暴露一些简单的接口。封装便于调用者调用,便于修改内部代码,提高可维护性,可进行数据完整性检测,保证数据的有效性

下表为关键字及其访问权限

关键字同一个类同一个包子类所有类
private
default
protected
public

类的属性一般用private修饰(除非确定会让其子类继承),通过 get/set方法来访问或操作这些属性

一些只用于本类的辅助性方法用private修饰,希望其它类可以调用的方法用public修饰


继承(extends)

继承可以提高代码的复用性,利用组合可以更好的实现代码复用

Java中使用extends关键字实现继承,子类继承父类,可以得到父类的所有属性和方法(尽管有些元素是private的,但子类仍可以拥有,但是不可以访问)

Java中只有单继承,多继承可以通过接口来实现

如果定义一个类时没有调用extends继承其他类,那默认该类继承了Object类,也称Object为祖先类

例如:

class Hello{  //这里就默认继承了Object类
    
    class Person{
        
        public String name;
        private int age;
        
        public String getName(){
            return this.name;
        }
        
        private int getAge(){
            return this.age;
        }
    }
    
    class Student extends Person{
        
    }
    //Student体内什么都没写,但因为继承了Person,所以仍然拥有name、age属性和getName、getAge方法,但由于在父类中age和getAge是私有的,所以Student创建的对象是无法访问age属性和调用getAge方法的
}

重写(overwrite)

  • 在子类继承父类的方法后,若该方法并不适宜当前的子类,则可以重写这个方法

  • 重写时需要方法名、参数列表和返回值都与父类的一致

  • 重写方法不能使用比被重写方法更严格的权限控制

  • 当我们调用一个对象方法时,优先从当前类开始查找,若没有再到父类查找

  • privatestaticfinal关键字修饰的方法不能重写

例如:

class Hello{
    
    class Person{
        
        public String name;
        private int age;
        
        public String getName(){
            return this.name;
        }
        
        private int getAge(){
            return this.age;
        }
    }
    
    class Student extends Person{
        
        public String getName(){  //方法名、参数列表、返回值类型都与父类一致
            return "张三";
        }
        
        public String getName(String name){  //参数列表不一致,不是重写,而是方法的重载
            this.name = name;
            return this.name;
        }
        
        // private String getName(){  //因为重写该方法时权限由public变为private,更严格了,故报错 
        //     return "张三";
        // }
    }
}

super关键字

首先可以将super笼统地理解为功能与this差不多的关键字,但是this指向的是当前对象,而super指向的则是该对象的父类。可以通过super去调用父类的属性或方法

例如:

class Hello{
    
    class Person{
        
        public String name;
        public int age;
        
        public String getName(){
            
            return this.name;
        }
    }
    
    class Student extends Person{
        
        public int number;
        
        public String getName(){
            
            return super.getName();  //使用super指向父类,调用父类指定方法
            //如果父类没有该方法,则继续向父类的父类查找
            //直到Object都没有找到则会报错
        }
    }
}

this可以调用本类的构造器,同样的super也可以调用父类的构造器,但与this不同的是,在子类的构造器中,尽管没有使用super去调用父类的构造器,但程序会默认调用父类的空构造器,这说明了在初始化子类时,肯定会先初始化其父类。这也带来了一个bug:如果父类编写了构造器并且没有编写空构造器,同时子类的构造器中没有调用父类的构造器则会报错。

例如:

class Hello{
	
    class Person{
        
        String name;
        int age;
        
        public Person(String name, int age){
            
            this.name = name;
            this.age = age;
        }
    }
    
    class Student(){
        
        int number;
        
        // public Student(String name, int age, int number){
        //     
        //     this.number = number;
        // }   
        //因为父类没有空构造器且这里没有调用父类的构造器,程序报错
        
        public Student(String name, int age, int number){
            
            super(name, age);  //与this一样,super也必须写在方法体的第一行
            this.number = number;
        }
    }
}

多态(polymorphism)

多态为代码的编写带来了很大的灵活性,实现多态的要求有三个:继承重写父类引用指向子类

用一个例子来解释多态

class Hello{
    
    public statci void main(String[] args){
        
        Student student = new Student();
        Teacher teacher = new Teacher();
        
        someoneSay(student);  //输出 我是学生
        someoneSay(teacher);  //输出 我是老师
        //someoneSay方法中选择用Student和Teacher共同的父类Person作为参数
        //因此无论传参是student或teacher都可以成功运行
        //这里的person引用是指向其子类的,会根据传参的真实对象去调用不同的方法
        //它并没有严格规定参数的类型而是模糊指定,实现了多态的功能
    }
    
    public static void someoneSay(Person person){
        
        person.say();
    }
    
    class Person{
        
        String name;
        int age;
        
        public void say(){
            
            System.out.println("我是人类");
        }
    }
    
    class Student extends Person{
        
        public void say(){
            
            System.out.println("我是学生");
        }
    }
    
    class Teacher extends Person{
        
        public void say(){
            
            System.out.println("我是老师");
        }
    }
}

注意:在父类引用指向子类的情况下,虽然创建的真实对象为子类的对象,但是其包含的属性和方法只有在父类中存在的属性和方法,并没有子类所特有(增加)的属性和方法


静态绑定与动态绑定

在类的编译期间,Jvm会找出该类的不可能存在多态情况的方法将其加载至该类的静态绑定区,不可能存在多态的方法有:private static final constructor(构造方法)

而其他方法因为有多态的嫌疑则加载至该类的动态绑定区

在调用该类的某个方法时,程序先在静态绑定区寻找该方法是否存在,若存在则直接运行,若不存在则再去动态绑定区寻找,找到后再确定调用该方法的真实类(可能是父类引用子类的情况)中的动态绑定区是否有该方法,若有则执行真实类的方法,没有则执行原先找到的方法。当然若静态绑定区和动态绑定区都没找到该方法就会报错了

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 09:51:10  更:2021-09-18 09:52:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:07:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码