铜梁旅游网站建设管理,深圳做品牌网站,织梦网站流动广告代码,昆明网站服务1. 面向对象基础
1.1 面向对象和面向过程的区别
面向过程把解决问题的过程拆成一个个方法#xff0c;通过一个个方法的执行解决问题。面向对象会先抽象出对象#xff0c;然后用对象执行方法的方式解决问题。
面向对象开发的方式更容易维护和迭代升级、易复用、易扩展。
1…1. 面向对象基础
1.1 面向对象和面向过程的区别
面向过程把解决问题的过程拆成一个个方法通过一个个方法的执行解决问题。面向对象会先抽象出对象然后用对象执行方法的方式解决问题。
面向对象开发的方式更容易维护和迭代升级、易复用、易扩展。
1.2 创建一个对象用什么运算符?对象实体与对象引用有何不同?
用new来创建一个对象。new 创建对象实例对象实例在堆内存中对象引用指向对象实例对象引用存放在栈内存中。 Student s new Student(); new Student()为对象实例存放在堆内存中。 s为对象引用存放在栈内存中 一个对象引用可以指向 0 个或 1 个对象一根绳子可以不系气球也可以系一个气球一个对象可以有 n 个引用指向它可以用 n 条绳子系住一个气球。
1.3 对象相等和引用相等的区别
对象的相等一般比较的是内存中存放的内容是否相等。引用相等一般比较的是他们指向的内存地址是否相等。
1.4 如果一个类没有声明构造方法该程序能正确执行吗?
构造方法是一种特殊的方法主要作用是完成对象的初始化工作。
如果一个类没有声明构造方法也可以执行因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法无论是否有参Java 就不会添加默认的无参数的构造方法了。
1.5 构造方法有哪些特点是否可被 override?
名字与类名相同。没有返回值但不能用 void 声明构造函数。生成类的对象时自动执行无需调用。
构造方法不能被 override重写,但是可以 overload重载,所以你可以看到一个类中有多个构造函数的情况。
1.6 面向对象的三大特性
封装
封装是指把一个对象的状态信息也就是属性隐藏在对象内部不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。就好像我们看不到挂在墙上的空调的内部的零件信息也就是属性但是可以通过遥控器方法来控制空调。
继承
不同类型的对象相互之间经常有一定数量的共同点。例如小明同学、小红同学、小李同学都共享学生的特性班级、学号等。同时每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比较好小红的性格惹人喜爱小李的力气比较大。继承是使用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新的数据或新的功能也可以用父类的功能但不能选择性地继承父类。通过使用继承可以快速地创建新的类可以提高代码的重用程序的可维护性节省大量创建新类的时间 提高我们的开发效率。
关于继承如下 3 点请记住
子类拥有父类对象所有的属性和方法包括私有属性和私有方法但是父类中的私有属性和方法子类是无法访问只是拥有。子类可以拥有自己属性和方法即子类可以对父类进行扩展。子类可以用自己的方式实现父类的方法。就是重写。
多态
一个对象具有多种的状态具体表现为父类的引用指向子类的实例。
多态的特点:
对象类型和引用类型之间具有继承类/实现接口的关系引用类型变量发出的方法调用的到底是哪个类中的方法必须在程序运行期间才能确定多态不能调用“只在子类存在但在父类不存在”的方法如果子类重写了父类的方法真正执行的是子类覆盖的方法如果子类没有覆盖父类的方法执行的是父类的方法。
1.7 接口和抽象类有什么共同点和区别
共同点
都不能被实例化。都可以包含抽象方法。都可以有默认实现的方法Java 8 可以用 default 关键字在接口中定义默认方法。
区别
接口主要用于对类的行为进行约束你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用强调的是所属关系。一个类只能继承一个类但是可以实现多个接口。接口中的成员变量只能是 public static final 类型的不能被修改且必须有初始值而抽象类的成员变量默认 default可在子类中被重新定义也可被重新赋值。
1.8 深拷贝和浅拷贝区别了解吗什么是引用拷贝
浅拷贝浅拷贝会在堆上创建一个新的对象区别于引用拷贝的一点不过如果原对象内部的属性是引用类型的话浅拷贝会直接复制内部对象的引用地址也就是说拷贝对象和原对象共用同一个内部对象。深拷贝深拷贝会完全复制整个对象包括这个对象所包含的内部对象。
这玩意用文字讲不明白直接上代码
浅拷贝 浅拷贝的示例代码如下我们这里实现了 Cloneable 接口并重写了 clone() 方法。 clone() 方法的实现很简单直接调用的是父类 Object 的 clone() 方法。 public class Address implements Cloneable{private String name;// 省略构造函数、GetterSetter方法Overridepublic Address clone() {try {return (Address) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}public class Person implements Cloneable {private Address address;// 省略构造函数、GetterSetter方法Overridepublic 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();
// true
System.out.println(person1.getAddress() person1Copy.getAddress());从输出结构就可以看出 person1 的克隆对象和 person1 使用的仍然是同一个 Address 对象。
深拷贝
这里我们简单对 Person 类的 clone() 方法进行修改连带着要把 Person 对象内部的 Address 对象一起复制。
Override
public 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();
// false
System.out.println(person1.getAddress() person1Copy.getAddress());从输出结构就可以看出显然 person1 的克隆对象和 person1 包含的 Address 对象已经是不同的了。
那什么是引用拷贝呢 简单来说引用拷贝就是两个不同的引用指向同一个对象。
我专门画了一张图来描述浅拷贝、深拷贝、引用拷贝