zoukankan      html  css  js  c++  java
  • java基础: 封装、继承、多态

    封装

    一、封装的好处

    1、提高安全性
    
    2、提高复用性
    
    3、将复杂的事情简单化
    

    二、Java中的封装体

    1、方法安全性:调用者不知道方法的具体实现
    
    2、复用性:方法可以被重复使用
    
    3、简单化:将繁多的代码以一个方法的方式呈现,仅通过调用方法就可以实现功能;代码维护也变得简单类
    

    三、private修饰成员变量

    四、构造方法

    构建、创造,也叫构造器,用来帮助创建对象的方法,准确的说,构造方法的作用是初始化对象
    

    格式:

        修饰符构造方法名(参数列表){//方法体}
        public class Student {
            public Student(String name, int age) {
                this.name = name;
                this.age = age;
            }
            public String name;
            private int age;
            public void study() {
                System.out.println(this.name);
                System.out.println("-------------------");
                System.out.println(this.age);
            }
        }  
    

    要求:

        1、方法名必须与类名相同
        2、没有返回值
        3、没有返回值类型
    注意事项
        1、若未提供任何构造方法,系统会给出默认无参构造
        2、若已提供任何构造方法,系统不再提供无参构造
        3、构造方法可以重载 
    

    Java中封装的概念

    将一系列相关事物共同的属性和行为提取出来,放到一个类中,隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
    隐藏对象数据的实现细节,意味着一个类可以全面的改变存储数据的方式,只要使用同样的方法操作数据,其它对象就不会知道或介意所发生的变化。
    

    封装的关键

    ==绝对不能让类中的方法直接访问其它类的数据(属性),程序仅通过对象的方法与对象的数据进行交互
    

    继承

    一、Java中的继承

    通过扩展一个类来建立另外一个类的过程,叫做继承(inheritance)
    通俗地说,所谓继承,就是让类与类之间产生父子关系。
    所有的类都直接或间接的继承自:
        java.lang.Object被继承的类叫做父类(基类、超类)继承的类叫做子类(派生类)
    

    二、格式(extends)

    class父类{
        //...
    }
    class子类extends父类{
        //...
    }
    
    // 调用类
    public class Test {
        public static void main(String[] args) {
            Dog d = new Dog("小白");
            d.setName("小黑");
            d.output();
        }
    }
    //父类 动物类
    public class Animal {
        public String name;
        public int age;
    
        public Animal(int age) {
            this.age = age;
        }
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    //子类 Dog类
    public class Dog extends Animal {
        public String name;
        public Dog(String name) {
            super(10);//调用父类构造 如果不写系统会默认调用
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void output() {
            //super.父类方法 子类调用父类方法
            System.out.println("父类的名字是" + super.getName());
            //this.父类方法 子类调用子类方法
            System.out.println("子类的名字是" + this.getName());
        }
    }
    
    

    三、子类继承父类之后有什么效果?

    子类拥有了父类的非私有成员(成员变量、成员方法)
    父类的私有成员不能被继承
    

    四、继承的优缺点

    优点:
        1、功能复用
        2、便于扩展新功能
        3、结构清晰,简化认识
        4、易维护性
    缺点:
        1、打破了封装性
        2、高耦合性
    

    五、this和super的区别

    1. 查找变量的原则:就近原则
    2. 查找变量的顺序:局部变量成员变量父类更高的父类...Object
    3. 访问父类变量的方式: super.父类变量名;
    4. super:当前对象父类的引用(父类内存空间的标识)
    5. 对象初始化顺序:先初始化父类内容,再初始化子类内容
    6、this:当前实例化对象
    

    多态

    //父类 动物类
    public class Animal {
        public String name;
    
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void eat() {
            System.out.println("吃饭");
        }
    }
    //子类 Dog类
    public class Dog extends Animal {
        @Override //重写父类的eat方法
        public void eat() {
            System.out.println(getName()+"吃骨头");
        }
    }
    //子类 Pig类
    public class Pig extends Animal {
        @Override
        public void eat() {
            System.out.println(getName()+"吃面条");
        }
    }
    // 调用类
    public class Test {
        public static void main(String[] args) {
            Dog d = new Dog();
            d.setName("小白");
            showAnimal(d);
    
            Pig p = new Pig();
            p.setName("小花");
            showAnimal(p);
        }
        //传统调用
        public static void showAnimal(Dog d) {
            d.eat();
        }
        public static void showAnimal(Pig p) {
            p.eat();
        }
    
        //多态调用
        //多态的使用场景:父类型可以作为形参的数据类型这样可以接受其任意的子类对象
        public static void showAnimal(Animal an) {
            an.eat();
        }
    }
    
    
    

    一、什么是多态?

    多种状态,同一对象在不同情况下表现出不同的状态或行为
    

    二、Java中实现多态的步骤

    1、要有继承(或实现)关系
    2、要有方法重写
    3、父类引用指向子类对象(is a关系)
    

    为什么父类引用可以指向子类对象?
    因为二者满足子类、父类的关系,所以任何一个Dog都可以Animal的形式使用

    加载类:

    创建子类对象时,先加载父类,再加载子类
    

    构造方法:

    先执行父类的构造方法,初始化子类对象的父类成员部分然后再初始化子类成员部分
    

    成员方法:

    类的成员方法在方法区开辟空间并有一个地址值,该类的每一个对象都会记录方法区中的地址
    在类的加载过程中,创建虚拟方法表,记录了子父类方法重写关系的信息。通过父类引用调用方法时,会查找虚拟方发表,看该方法是否被重写,如果表中记录了重写信息,则执行子类的重写方法。
    

    多态的好处和弊端

    多态的好处可维护性:
        基于继承关系,只需要维护父类代码,提高了代码的复用性,大大降低了维护程序的工作量
        为什么要学习多态:
            从程序的模块化和复用性来解释
                封装:隐藏数据的实现细节,让数据的操作模块化,提高代码复用性
                继承:复用方法,从对象的行为这个层面,提高代码的复用性
                多态:复用对象,程序运行时同一个对象表现出不同的行为
                可扩展性:把不同的子类对象都当作父类看待,屏蔽了不同子类对象间的差异,做出通用的代码,以适应不同的需求,实现了向后兼容
    
    多态的弊端
        不能使用子类特有成员
        解决办法:
            向下转型(前提:必须准确知道该父类引用指向的子类类型)
    
    类型转换
        当需要使用子类特有功能时,需要进行类型转换
    ```
    向上转型(自动类型转换)//子类型转换成父类型Animal animal = new Dog();
    向下转型(强制类型转换)//父类型转换成子类型Dog dog = (Dog)animal;
    注意事项
        只能在继承层次内进行转换,否则可能造成异常(ClassCastException)将父类对象转换成子类之前,使用instanceof进行检查
    ```
  • 相关阅读:
    将项目发布到多台服务器并解决高并发
    Nginx 反向代理和负载均衡
    Nginx的基本理论
    图片上传功能(EasyUI前台框架+SSM框架)
    错误:Eclipse老是出现 updating error reports database
    JPA
    Java中 @override 报错
    SpringBoot常用注解
    SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法)
    SpringBoot学习:整合shiro(rememberMe记住我功能)
  • 原文地址:https://www.cnblogs.com/lin127/p/12605061.html
Copyright © 2011-2022 走看看