0
点赞
收藏
分享

微信扫一扫

开课吧AI算法落地与工程部署实战

开课吧AI算法落地与工程部署实战

Java 根底常见学问点&面试题总结面向对象根底面向对象和面向过程的区别两者的主要区别在于处理问题的方式不同:

面向过程把处理问题的过程拆成一个个办法,经过一个个办法的执行处理问题。面向对象会先笼统出对象,然后用对象执行办法的方式处理问题。

另外,面向对象开发的程序普通更易维护、易复用、易扩展。相关 issue : 面向过程 :面向过程性能比面向对象高??成员变量与部分变量的区别

语法方式 :从语法方式上看,成员变量是属于类的,而部分变量是在代码块或办法中定义的变量或是办法的参数;成员变量能够被 public,private,static 等修饰符所修饰,而部分变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和部分变量都能被 final 所修饰。存储方式 :从变量在内存中的存储方式来看,假如成员变量是运用 static 修饰的,那么这个成员变量是属于类的,假如没有运用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,部分变量则存在于栈内存。生存时间 :从变量在内存中的生存时间上看,成员变量是对象的一局部,它随着对象的创立而存在,而部分变量随着办法的调用而自动生成,随着办法的调用完毕而消亡。默许值 :从变量能否有默许值来看,成员变量假如没有被赋初始值,则会自动以类型的默许值而赋值(一种状况例外:被 final 修饰的成员变量也必需显式地赋值),而部分变量则不会自动赋值。

创立一个对象用什么运算符?对象实体与对象援用有何不同?new 运算符,new 创立对象实例(对象实例在堆内存中),对象援用指向对象实例(对象援用寄存在栈内存中)。一个对象援用能够指向 0 个或 1 个对象(一根绳子能够不系气球,也能够系一个气球);一个对象能够有 n 个援用指向它(能够用 n 条绳子系住一个气球)。对象的相等和援用相等的区别

对象的相等普通比拟的是内存中寄存的内容能否相等。援用相等普通比拟的是他们指向的内存地址能否相等。

类的结构办法的作用是什么?结构办法是一种特殊的办法,主要作用是完成对象的初始化工作。假如一个类没有声明结构办法,该程序能正确执行吗?假如一个类没有声明结构办法,也能够执行!由于一个类即便没有声明结构办法也会有默许的不带参数的结构办法。假如我们本人添加了类的结构办法(无论能否有参),Java 就不会再添加默许的无参数的结构办法了,我们不断在不知不觉地运用结构办法,这也是为什么我们在创立对象的时分后面要加一个括号(由于要调用无参的结构办法)。假如我们重载了有参的结构办法,记得都要把无参的结构办法也写出来(无论能否用到),由于这能够协助我们在创立对象的时分少踩坑。结构办法有哪些特性?能否可被 override?结构办法特性如下:

名字与类名相同。没有返回值,但不能用 void 声明结构函数。生成类的对象时自动执行,无需调用。

结构办法不能被 override(重写),但是能够 overload(重载),所以你能够看到一个类中有多个结构函数的状况。面向对象三大特征封装封装是指把一个对象的状态信息(也就是属性)躲藏在对象内部,不允许外部对象直接访问对象的内部信息。但是能够提供一些能够被外界访问的办法来操作属性。就仿佛我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是能够经过遥控器(办法)来控制空调。假如属性不想被外界访问,我们大可不用提供办法给外界访问。但是假如一个类没有提供应外界访问的办法,那么这个类也没有什么意义了。就仿佛假如没有空调遥控器,那么我们就无法操控空凋制冷,空调自身就没有意义了(当然如今还有很多其他办法 ,这里只是为了举例子)。public class Student {    private int id;//id属性私有化    private String name;//name属性私有化

    //获取id的办法    public int getId() {        return id;    }

    //设置id的办法    public void setId(int id) {        this.id = id;    }

    //获取name的办法    public String getName() {        return name;    }

    //设置name的办法    public void setName(String name) {        this.name = name;    }}复制代码继承不同类型的对象,互相之间经常有一定数量的共同点。例如,小明同窗、小红同窗、小李同窗,都共享学生的特性(班级、学号等)。同时,每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比拟好,小红的性格惹人喜欢;小李的力气比拟大。继承是运用已存在的类的定义作为根底树立新类的技术,新类的定义能够增加新的数据或新的功用,也能够用父类的功用,但不能选择性地继承父类。经过运用继承,能够快速地创立新的类,能够进步代码的重用,程序的可维护性,俭省大量创立新类的时间 ,进步我们的开发效率。关于继承如下 3 点请记住:

子类具有父类对象一切的属性和办法(包括私有属性和私有办法),但是父类中的私有属性和办法子类是无法访问,只是具有。子类能够具有本人属性和办法,即子类能够对父类停止扩展。子类能够用本人的方式完成父类的办法。(以后引见)。

多态多态,望文生义,表示一个对象具有多种的状态,详细表现为父类的援用指向子类的实例。多态的特性:

对象类型和援用类型之间具有继承(类)/完成(接口)的关系;援用类型变量发出的办法调用的到底是哪个类中的办法,必需在程序运转期间才干肯定;多态不能调用“只在子类存在但在父类不存在”的办法;假如子类重写了父类的办法,真正执行的是子类掩盖的办法,假如子类没有掩盖父类的办法,执行的是父类的办法。

接口和笼统类有什么共同点和区别?共同点 :

都不能被实例化。都能够包含笼统办法。都能够有默许完成的办法(Java 8 能够用 default 关键字在接口中定义默许办法)。

区别 :

接口主要用于对类的行为停止约束,你完成了某个接口就具有了对应的行为。笼统类主要用于代码复用,强调的是所属关系(比方说我们笼统了一个发送短信的笼统类,)。一个类只能继承一个类,但是能够完成多个接口。接口中的成员变量只能是 public static final 类型的,不能被修正且必需有初始值,而笼统类的成员变量默许 default,可在子类中被重新定义,也可被重新赋值。

深拷贝和浅拷贝区别理解吗?什么是援用拷贝?关于深拷贝和浅拷贝区别,我这里先给结论:

浅拷贝:浅拷贝会在堆上创立一个新的对象(区别于援用拷贝的一点),不过,假如原对象内部的属性是援用类型的话,浅拷贝会直接复制内部对象的援用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝 :深拷贝会完整复制整个对象,包括这个对象所包含的内部对象。

上面的结论没有完整了解的话也没关系,我们来看一个详细的案例!浅拷贝浅拷贝的示例代码如下,我们这里完成了 Cloneable 接口,并重写了 clone() 办法。clone() 办法的完成很简单,直接调用的是父类 Object 的 clone() 办法。public class Address implements Cloneable{    private String name;    // 省略结构函数、Getter&Setter办法    @Override    public Address clone() {        try {            return (Address) super.clone();        } catch (CloneNotSupportedException e) {            throw new AssertionError();        }    }}

public class Person implements Cloneable {    private Address address;    // 省略结构函数、Getter&Setter办法    @Override    public Person clone() {        try {            Person person = (Person) super.clone();            return person;        } catch (CloneNotSupportedException e) {            throw new AssertionError();        }    }}复制代码测试 :Person person1 = new Person(new Address("武汉"));Person person1Copy = person1.clone();// trueSystem.out.println(person1.getAddress() == person1Copy.getAddress());复制代码从输出构造就能够看出, person1 的克隆对象和 person1 运用的依然是同一个 Address 对象。深拷贝这里我们简单对 Person 类的 clone() 办法停止修正,连带着要把 Person 对象内部的 Address 对象一同复制。@Overridepublic Person clone() {    try {        Person person = (Person) super.clone();        person.setAddress(person.getAddress().clone());        return person;    } catch (CloneNotSupportedException e) {        throw new AssertionError();    }}复制代码测试 :Person person1 = new Person(new Address("武汉"));Person person1Copy = person1.clone();// falseSystem.out.println(person1.getAddress() == person1Copy.getAddress());复制代码从输出构造就能够看出,固然 person1 的克隆对象和 person1 包含的 Address 对象曾经是不同的了。


举报

相关推荐

0 条评论