文章目录
21、写 clone()方法时,通常都有一行代码,是什么
示例
@Data
public class Person implements Cloneable {
private String name;
private Integer age;
private Address address;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
@Test
public void testShallowCopy() throws Exception{
Person p1=new Person();
p1.setAge(31);
p1.setName("Peter");
Person p2=(Person) p1.clone();
System.out.println(p1==p2);//false
p2.setName("Jacky");
System.out.println("p1="+p1);//p1=Person [name=Peter, age=31]
System.out.println("p2="+p2);//p2=Person [name=Jacky, age=31]
}
clone 有一行默认的代码 :super.clone();
因为首先是把父类的成员复制到位,然后才是复制自己的成员
22、面向对象的特征(特点)
1)抽象
找出一组事物的共性,把这些事物归纳成一个类,抽象事物的 属性和行为
分别对应类的属性和方法
2)封装
把对象的属性和行为放到一起,把握的原则:把对统一事物的 相关的数据和操作数据的方法放在同一个类中
3)继承
提高代码的重用和可扩展性
4)多态
多态性是指允许相同或不同子类型的对象对同一消息作出不同响应
引用变量指向的具体类型和其调用的方法编程时不确定,运行期间才确定
多态的机制可以动态的绑定
写到这里,想起了一个问题:运行时多态 和编译多态 参考文章
23、java中实现多态的机制
引用自 https://blog.csdn.net/qq895627041/article/details/82109576
1)接口
接口中的变量会被隐式地指定为public static final变量。
接口中的方法都是抽象方法。
一个类可继承多个接口。
实现接口需实现接口中的所有方法。
示例代码
public interface InterDemo(){
void setData();
int getCount();
}
public class InterImpl implements InterDemo(){
@Override
public void setData(){
//....
}
@Override
public void getCount(){
//....
}
}
2)抽象类
interface FlyInter {
void fly();
}
public abstract class FlyGroups implements FlyInter{
public String name = "飞行类";
public String getName(){
return name;
}
abstract void fun();
}
public class Airplane extends FlyGroups {
@Override
public void fly() {
String name = super.getName();
System.out.println(name);
}
@Override
public void fun(){
}
}
3)继承父类,子类重写父类的方法
public class Parent{
public void fun(){
}
}
public class Child extends Parent{
@Override
public void fun(){
//子类的重写
}
}
4)同一个类中的方法重载
public class Parent{
public void fun(){
}
}
public class Child extends Parent{
@Override
public void fun(){
//子类的重写
}
}
总结:
java中通过四种方式表达多态
1)通过接口的方式,接口可以包含很多的方法,表达对象的行为,功能
2)通过抽象类的方式,抽象类中的抽象方法只有方法头,没有方法的具体实现,因为抽象类不能实例化,在子类继承抽象类,重写抽象方法的时候,可以表达子类独立的实现,每个子类都可以有不同的实现
3)通过继承,子类可以重写父类的方法 *** 并且通过父类的引用指向子类的对象***,可以更好的表达多态的特点,多用于 参数接收对象
4)通过同一个类中的方法重载,同名不同参,相同的方法名,不同的参数,实现重载
24、 抽象类和接口的区别
详情参看 https://blog.csdn.net/GorgeousChou/article/details/88071884
1)语法上的区别
1.抽象类可以有构造方法,接口没有构造方法
2.抽象类可以有普通的成员变量,接口中没有普通的成员变量
3.抽象类中可以包含非抽象的普通方法,接口的方法默认是 public abstract
4.抽象类可以包含静态方法,接口不能包含静态的方法
5.一个类可以实现多个接口,但是一个类只能继承一个抽象类
2)使用上的区别
1.抽象类的本质是一个 类
2.接口表征是一种能力
我的总结
25、抽象方法是否可以说 static native synchronized
抽象方法不可以是 static的,抽象方法表示需要给 子类实现,static和子类没有关系
native 表示该方法需要依赖另一种编程方法实现
synchronized 需要配合具体的方法才可以,需要配合 this,确定同步锁的 对象,抽象方法上,无法确定 this 是什么
26、什么是内部类、 static nested class 和 inner class
省略,内部类现在 用的不多
27、内部类可以引用它的包含类的成员吗
可以,如果不是静态内部类,就没有什么影响
28、Annoymous inner class (匿名内部类)是否可以继承其他的类,是否可以实现接口
必须 继承其他的类或者实现接口
29、super.getClass() 方法的调用
public class Father {
}
public class Son extends Father{
public void myGetSuperClassName() {
System.out.println(super.getClass());
System.out.println(super.getClass().getSuperclass().getName());
}
public static void main(String[] args) {
new Son().myGetSuperClassName();
}
}
输出的结果
class test29.Son
test29.Father
30、String 是基本的数据类型吗
答案 : 不是
基本的数据类型 只有8个
int 、double、float、short、long、char、byte、boolean
String是 引用类型