02.Java面向对象问题

目录介绍

  • 2.0.0.1 重载和重写的区别?重载和重写绑定机制有何区别?父类的静态方法可否被子类重写?
  • 2.0.0.2 封装、继承、多态分别是什么?
  • 2.0.0.3 接口和抽象类的区别是什么?接口的意义是什么?抽象类的意义是什么?如何选择抽象类和接口?
  • 2.0.0.4 什么是内部类,有哪些?有什么做用?静态内部类和非静态内部类的区别?
  • 2.0.0.5 为何内部类调用的外部变量必须是final修饰的?
  • 2.0.0.6 Java实现多态有哪些必要条件?具体怎么实现?多态的实现原理?多态的做用?
  • 2.0.0.7 什么是多态?多态的实现方式有哪些?多态有哪些弊端?
  • 2.0.0.9 静态变量和成员变量的区别?代码块有哪些?构造代码块和构造方法哪个先执行?
  • 2.0.1.0 抽象类具备什么特色?抽象类和普通类有何区别?抽象类能够new吗?会出现什么问题?

好消息

  • 博客笔记大汇总【15年10月到至今】,包括Java基础及深刻知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,固然也在工做之余收集了大量的面试题,长期更新维护而且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢!
  • 连接地址:https://github.com/yangchong211/YCBlogs
  • 若是以为好,能够star一下,谢谢!固然也欢迎提出建议,万事起于忽微,量变引发质变!全部博客将陆续开源到GitHub!

2.0.0.1 重载和重写的区别?重载和重写绑定机制有何区别?父类的静态方法可否被子类重写?

  • 重载
    • 发生在同一个类中,方法名必须相同,参数类型不一样、个数不一样、顺序不一样,方法返回值和访问修饰符能够不一样,发生在编译时。   
  • 重写
    • 重写表示子类重写父类的方法
    • 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;若是父类方法访问修饰符为 private 则子类就不能重写该方法。
  • 重载和重写绑定机制有何区别?
    • 重载:类内多态,静态绑定机制(编译时已经知道具体执行哪一个方法),方法同名,参数不一样
    • 重写:类间多态,动态绑定机制(运行时肯定),实例方法,两小两同一大(方法签名相同,子类的方法所抛出的异常、返回值的范围不大于父类的对应方法,子类的方法可见性不小于父类的对应方法)方法签名相同,子类的方法所抛出的异常、返回值的范围不大于父类的对应方法,子类的方法可见性不小于父类的对应方法
  • 父类的静态方法可否被子类重写
    • 父类的静态方法是不能被子类重写的,其实重写只能适用于实例方法,不能用于静态方法,对于上面这种静态方法而言,咱们应该称之为隐藏。
    • 技术博客大总结
    • Java静态方法形式上能够重写,但从本质上来讲不是Java的重写。由于静态方法只与类相关,不与具体实现相关。声明的是什么类,则引用相应类的静态方法(原本静态无需声明,能够直接引用)。而且static方法不是后期绑定的,它在编译期就绑定了。换句话说,这个方法不会进行多态的判断,只与声明的类有关。

2.0.0.2 面向对象编程的四大特性及其含义?封装、继承、多态分别是什么?

  • 封装
    • 将某事物的属性和行为包装到对象中,构成一个不可分割的独立实体。
    • 封装把一个对象的属性私有化,同时提供一些能够被外界访问的属性的方法,若是属性不想被外界访问,咱们大可没必要提供方法给外界访问。可是若是一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
  • 继承
    • 继承是使用已存在的类的定义做为基础创建新类的技术,新类的定义能够增长新的数据或新的功能,也能够用父类的功能,但不能选择性地继承父类。经过使用继承咱们可以很是方便地复用之前的代码。
    • 注意
      • 子类拥有父类非 private 的属性和方法。
      • 子类能够拥有本身属性和方法,即子类能够对父类进行扩展。
      • 子类能够用本身的方式实现父类的方法。
  • 多态
    • 所谓多态就是指程序中定义的引用变量所指向的具体类型和经过该引用变量发出的方法调用在编程时并不肯定,而是在程序运行期间才肯定,即一个引用变量倒底会指向哪一个类的实例对象,该引用变量发出的方法调用究竟是哪一个类中实现的方法,必须在由程序运行期间才能决定。
    • 在Java中有两种形式能够实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
  • 抽象
    • 对现实世界的事物进行归纳,抽象为在计算机虚拟世界中有意义的实体

2.0.0.3 接口和抽象类的区别是什么?接口的意义是什么?抽象类的意义是什么?如何选择抽象类和接口?

  • 接口和抽象类的区别是什么
    • 接口的方法默认是 public,全部方法在接口中不能有实现(Java 8 开始接口方法能够有默认实现),抽象类能够有非抽象的方法
    • 接口中的实例变量默认是 final 类型的,而抽象类中则不必定
    • 一个类能够实现多个接口,但最多只能实现一个抽象类
    • 一个类实现接口的话要实现接口的全部方法,而抽象类不必定
    • 接口不能用 new 实例化,但能够声明,可是必须引用一个实现该接口的对象 从设计层面来讲,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
  • 接口的做用是什么
    • 技术博客大总结
    • 一、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是因为这两种机制的存在,才赋予了Java强大的 面向对象能力。
    • 二、简单、规范性:若是一个项目比较庞大,那么就须要一个能理清全部业务的架构师来定义一些主要的接口,这些接口不只告诉开发人员你须要实现那些业务,并且也将命名规范限制住了(防止一些开发人员随便命名致使别的程序员没法看明白)。
    • 三、维护、拓展性:好比你要作一个画板程序,其中里面有一个面板类,主要负责绘画功能,而后你就这样定义了这个类。但是在不久未来,你忽然发现这个类知足不了你了,而后你又要从新设计这个类,更糟糕是你可能要放弃这个类,那么其余地方可能有引用他,这样修改起来很麻烦。
    • 若是你一开始定义一个接口,把绘制功能放在接口里,而后定义类时实现这个接口,而后你只要用这个接口去引用实现它的类就好了,之后要换的话只不过是引用另外一个类而已,这样就达到维护、拓展的方便性。
    • 四、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的全部服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(通常软件服务商考虑的比较多)。
  • 抽象类的意义是什么
    • 1.由于抽象类不能实例化对象,因此必需要有子类来实现它以后才能使用。这样就能够把一些具备相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。
    • 2.当又有一个具备类似的组件产生时,只须要实现该抽象类就能够得到该抽象类的那些属性和方法。
  • 如何选择抽象类和接口?
    • 使用接口:
      • 须要让不相关的类都实现一个方法,例如不相关的类均可以实现 Compareable 接口中的 compareTo() 方法;
      • 须要使用多重继承。
    • 使用抽象类:
      • 须要在几个相关的类中共享代码。
      • 须要能控制继承来的成员的访问权限,而不是都为 public。
      • 须要继承非静态和很是量字段。

2.0.0.4 什么是内部类,有哪些?有什么做用?静态内部类和非静态内部类的区别?

  • 什么是内部类
    • 内部类就是定义在另一个类里面的类。它隐藏在外部类中,封装性更强,不容许除外部类外的其余类访问它;但它可直接访问外部类的成员。
  • 内部类有哪些
    • 成员内部类:成员内部类是外围类的一个成员,是依附于外围类的,因此,只有先建立了外围类对象才可以建立内部类对象。也正是因为这个缘由,成员内部类也不能含有 static 的变量和方法;
    • 静态内部类:静态内部类,就是修饰为static的内部类,该内部类对象不依赖于外部类对象,就是说咱们能够直接建立内部类对象,但其只能够直接访问外部类的全部静态成员和静态方法;
    • 局部内部类:局部内部类和成员内部类同样被编译,只是它的做用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效;
    • 匿名内部类:定义匿名内部类的前提是,内部类必需要继承一个类或者实现接口,格式为 new 父类或者接口(){定义子类的内容(如函数等)}。也就是说,匿名内部类最终提供给咱们的是一个 匿名子类的对象。
  • 静态内部类和非静态内部类的区别有:
    • 静态内部类是指被声明为static的内部类,可不依赖外部类实例化;而非静态内部类须要经过生成外部类来间接生成。
    • 静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类因为持有对外部类的引用,能够访问外部类的所用成员

2.0.0.5 为何内部类调用的外部变量必须是final修饰的?

  • 为何内部类调用的外部变量必须是final修饰的?
    • 简单解答:一方面,因为方法中的局部变量的生命周期很短,一旦方法结束变量就要被销毁,为了保证在内部类中能找到外部局部变量,经过final关键字可获得一个外部变量的引用;另外一方面,经过final关键字也不会在内部类去作修改该变量的值,保护了数据的一致性。
    • 详细一点能够这样说:由于生命周期的缘由。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类实际上是处于同一个级别,内部类不会由于定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,若是外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量确定也就被GC了,然而内部类的某个方法尚未执行完,这个时候他所引用的外部变量已经找不到了。若是定义为final,java会将这个变量复制一份做为成员变量内置于内部类中,这样的话,因为final所修饰的值始终没法改变,因此这个变量所指向的内存区域就不会变。为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题

2.0.0.7 什么是多态?多态实现条件?多态的实现方式有哪些?

  • 什么是多态?
    • 多态是指程序中定义的引用变量所指向的具体类型和经过该引用变量发出的方法调用在编程时并不肯定,而是在程序运行期间才肯定,即一个引用变量倒底会指向哪一个类的实例对象,该引用变量发出的方法调用究竟是哪一个类中实现的方法,必须在由程序运行期间才能决定。由于在程序运行时才肯定具体的类,这样,不用修改源程序代码,就可让引用变量绑定到各类不一样的类实现上,从而致使该引用调用的具体方法随之改变,即不修改程序代码就能够改变程序运行时所绑定的具体代码,让程序能够选择多个运行状态,这就是多态性。
  • 多态实现条件?
    • Java实现多态有三个必要条件:继承、重写、向上转型。
    • 继承:在多态中必须存在有继承关系的子类和父类。
    • 重写:子类对父类中某些方法进行从新定义,在调用这些方法时就会调用子类的方法。
    • 向上转型:在多态中须要将子类的引用赋给父类对象,只有这样该引用才可以具有技能调用父类的方法和子类的方法。
  • 多态的实现方式有哪些?php

    • 多态做用:多态性就是相同的消息使得不一样的类作出不一样的响应。
    • 第一种实现方式:基于继承实现的多态java

      • 基于继承的实现机制主要表如今父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写能够表现出不一样的行为。多态的表现就是不一样的对象能够执行相同的行为,可是他们都须要经过本身的实现方式来执行,这就要得益于向上转型了。git

        public class MainJava {
        public static void main(String[] args) {
            //定义父类数组
            Wine[] wines = new Wine[2];
            //定义两个子类
            Test1 test1 = new Test1();
            Test2 test2 = new Test2();
            Wine win e = new Wine();
            //父类引用子类对象
            wines[0] = test1;
            wines[1] = test2;
            for(int i = 0 ; i < 2 ; i++){
                System.out.println(wines[i].toString() + "--" + wines[i].drink());
            }
            System.out.println("-------------------------------");
            System.out.println(test1.toString() + "--" + test1.drink());
            System.out.println(test2.toString() + "--" + test2.drink());
        }
        public static class Wine {
            private String name;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return null;
            }
        }
        
        public static class Test1 extends Wine{
            public Test1(){
                setName("Test1");
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return "Wine : " + getName();
            }
        }
        
        public static class Test2 extends Wine{
            public Test2(){
                setName("Test2");
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return "Wine : " + getName();
            }
        }
        }
    • 第二种实现多态的方式:基于接口实现的多态
      • 继承是经过重写父类的同一方法的几个不一样子类来体现的,那么就可就是经过实现接口并覆盖接口中同一方法的几不一样的类体现的。
      • 在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。
      • 继承都是单继承,只能为一组相关的类提供一致的服务接口。可是接口能够是多继承多实现,它可以利用一组相关或者不相关的接口进行组合与扩充,可以对外提供一致的服务接口。因此它相对于继承来讲有更好的灵活性。
  • 多态有哪些弊端?

2.0.0.9 静态变量和成员变量的区别?代码块有哪些?构造代码块和构造方法哪个先执行?

  • 静态变量和成员变量的区别
    • A:所属不一样
      • 静态变量属于类,因此也称为类变量
      • 成员变量属于对象,因此也称为实例变量(对象变量)
    • B:内存中位置不一样
      • 静态变量存储于方法区的静态区
      • 成员变量存储于堆内存
    • C:内存出现时间不一样
      • 静态变量随着类的加载而加载,随着类的消失而消失
      • 成员变量随着对象的建立而存在,随着对象的消失而消失
    • D:调用不一样
      • 静态变量能够经过类名调用,也能够经过对象调用
      • 成员变量只能经过对象名调用
  • 代码块有哪些
    • A:代码块概述
      • 在Java中,使用{}括起来的代码被称为代码块。
    • B:代码块分类
      • 根据其位置和声明的不一样,能够分为局部代码块,构造代码块,静态代码块,同步代码块。
    • C:常见代码块的应用
      • a:局部代码块
        • 在方法中出现;限定变量生命周期,及早释放,提升内存利用率
      • b:构造代码块
        • 在类中方法外出现;多个构造方法方法中相同的代码存放到一块儿,每次调用构造都执行,而且在构造方法前执行
      • c:静态代码块
        • 在类中方法外出现,加了static修饰
        • 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,而且只执行一次。
  • 构造代码块和构造方法哪个先执行?

2.0.1.0 抽象类具备什么特色?抽象类和普通类有何区别?抽象类能够new吗?会出现什么问题?

  • 抽象类具备什么特色
    • 抽象类和抽象方法都使用 abstract 关键字进行声明。抽象类通常会包含抽象方法,抽象方法必定位于抽象类中。
  • 抽象类和普通类有何区别程序员

    • 抽象类和普通类最大的区别是,抽象类不能被实例化,须要继承抽象类才能实例化其子类。github

      public abstract class AbstractClassExample {
      protected int x;
      private int y;
      public abstract void func1();
      
      public void func2() {
          System.out.println("func2");
      }
      }

    public class AbstractExtendClassExample extends AbstractClassExample {br/>@Override
    public void func1() {
    System.out.println("func1");
    }
    }面试

     
  • 抽象类能够new吗?会出现什么问题?
    • 注意抽象类是不能被实例化的,也就是不能new出来的!
    • 若是执意须要new,则会提示
    • image

其余介绍

01.关于博客汇总连接

02.关于个人博客

相关文章
相关标签/搜索