Java基础复习(DaySix)

public SonTwo() {

}

public Integer getOld() {

return old;

}

public void setOld(Integer old) {

this.old = old;

}

@Override

public String getName() {

return name;

}

@Override

public void setName(String name) {

this.name = name;

}

@Override

public Integer getId() {

return id;

}

@Override

public void setId(Integer id) {

this.id = id;

}

@Override

public String getNick() {

return nick;

}

@Override

public void setNick(String nick) {

this.nick = nick;

}

}

下面是父类

/**

  • @Author: Ember

  • @Date: 2021/5/19 10:50

  • @Description:

*/

public class FatherTwo {

private Integer age;

private String name;

public String nick;

public Integer id;

public FatherTwo(Integer age, String name, String nick, Integer id) {

this.age = age;

this.name = name;

this.nick = nick;

this.id = id;

}

public FatherTwo() {

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】

public String getNick() {

return nick;

}

public void setNick(String nick) {

this.nick = nick;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

}

调用方法测试一下方法与属性的优先级

public class TestExtend {

public static void main(String[] args) {

FatherTwo father = new SonTwo(1,“我是son”,1,“son”);

//方法是优先访问子类

System.out.println(father.getName());

System.out.println(father.getNick());

System.out.println(father.getId());

System.out.println(father.getAge());

//可以看到,会优先访问父类

System.out.println(father.id);

System.out.println(father.nick);

}

}

在这里插入图片描述

可以看到,没有子类的getOld方法,证明不可以调用父类没有的方法

在这里插入图片描述

[](()阻止继承:final类和方法


给类加上final关键字,那么该类就不会被继承

给类中的特定方法加上final关键字,那么该方法就不可以被子类覆盖重写,final类中的所有方法自动地变成final方法

给属性加上final关键字,那么该属性必须在类构建实例的时候进行初始化,而且构建实例之后,这个属性不可以再被修改。

[](()强制类型转化


前面已经学习过基本数据类型进行强制转换。

那么对于引用类型进行强制转化会怎样

将一个值赋值给变量时,编译器会去检查这样的行为是否承诺过多,如果将一个子类的引用赋值给父类的变量,那就没问题,如果将一个父类的变量引用赋值给子类,那么就承诺过多了(父类没有子类的完全功能,这个变量会缺少一部份功能),必须要进行强制转换。

应用类型的强制转化有如下规则

  • 只能在继承层次内进行强制转换

  • 在将父类强制转换成子类之前,应该使用instanceof进行检查

  • instanceof会查看是否能够成功地转化,如果可以,那就返回True,如果不行,就会返回false

我们仍然使用上面的父与子类来测试

/**

  • @Author: Ember

  • @Date: 2021/5/19 10:51

  • @Description:

*/

public class TestExtend {

public static void main(String[] args) {

FatherTwo father = new SonTwo(1,“我是son”,1,“son”);

FatherTwo fatherTwo = new FatherTwo();

System.out.println(father instanceof SonTwo);

System.out.println(fatherTwo instanceof SonTwo);

}

}

在这里插入图片描述

可以看到,若父引用要可以强转成子变量,前提是这个父引用是子引用来的

[](()抽象类


继承产生了一种自上而下的层次结构,最上面的类更加具有一般性,可能更加抽象,而下层的类则在不断扩展

祖先类更有一般性,人们只将它作为派生其他类的基类,而不会去用来实例化想要得到的对象

抽象类的规则如下

  • 抽象类可以有抽象方法,其他属性和方法都跟一般类一致(可以有public、protected和default这些修饰符)

  • 抽象类不可以去实例化

  • 抽象类也可以有自己的静态变量和静态方法,同样也可以直接使用抽象类进行调用

  • 继承抽象类的所有对象也会继承静态方法和静态变量

  • 如果抽象类被继承(只能被单继承)

  • 如果是抽象类继承抽象类,可以不去实现父抽象类的抽象方法(但该抽象方法也会被子抽象类继承下来)

  • 如果是一般类继承抽象类,必须去实现父抽象类的抽象方法

  • 继承类无论是抽象类还是子类,都要在构造方法上调用super来构造父抽象类的实例

  • 抽象类也要有自己的构造方法,只可以被子类使用super来调用(因为属性还是位于抽象类里面,需要对外提供构造方法来进行实例化),在单元测试上是不可以调用的,也就是不支持使用new去实例

[](()权限修饰符


  1. 对外部完全可见——public

  2. 对本包和所有子类可见——protected

  3. 对本包可见——默认,不需要修饰符

  4. 仅仅对本类可见——private

一般来说,想要进行限制某个方法或者变量的话,使用protected。

[](()Object:所有类的超类


Object类是Java中所有类的始祖,每个类都扩展了Object,但是并不需要去手动继承

如果没有明确指出超类,Object就被认为是这个类的超类

可能这里有人以为,那明确指出超类,不就没有Object当父类了吗?

其实并不是这样,因为Object始终位于架构的最上层,也就是最模糊最抽象的一层。

[](()Object的equals方法

在这里插入图片描述

可以看到Object实例的equals方法仅仅用于检测一个对象是否等于另外一个对象,即判断两个对象的引用地址是否相等

但Oject还提供了静态的比较方法

在这里插入图片描述

可以看到静态方法的equals不仅检测两个对象的引用地址是否相等,还会去检测一方是否为空,如果不为空,调用这一方的equals方法,前面提到过,如果Object a是由多态而来的,equals方法会优先调用子类的重写,所以这里不一定会调用object实例的equals

但一般这种机制不太够用,所以有时候类也要去重写equals方法

/**

  • @Author: Ember

  • @Date: 2021/5/19 15:24

  • @Description:

*/

public class Employee {

private String nickName;

private Integer employId;

public Employee(String nickName, Integer employId) {

this.nickName = nickName;

this.employId = employId;

}

public Employee() {

}

/idea自动生成的重写方法/

@Override

public boolean equals(Object o) {

//先判断是否是同一个引用

if (this == o) {return true;}

//判断比较的对象是否为空

//getClass方法是获取一个实例对象所属的类

//判断是不是通一个类

if (o == null || getClass() != o.getClass()){ return false;}

//强转成同一个类

Employee employee = (Employee) o;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你复习Java基础面试题。以下是一些常见的Java基础面试题及其答案: 1. Java中的基本数据类型有哪些? 答:Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。 2. Java中的包装类是什么? 答:包装类是一种将基本数据类型封装成对象的方式。Java提供了对应于每个基本数据类型的包装类,如Integer、Double、Boolean等。 3. Java中的String类是可变的吗? 答:String类是不可变的,即一旦创建就不能被修改。如果需要对字符串进行修改操作,可以使用StringBuilder或StringBuffer类。 4. Java中的final关键字有什么作用? 答:final关键字可以用来修饰类、方法和变量。当修饰类时,表示该类不能被继承;当修饰方法时,表示该方法不能被重写;当修饰变量时,表示该变量的值不能被修改。 5. Java中的抽象类和接口有什么区别? 答:抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。接口是一种完全抽象的类,它只能包含抽象方法和常量。一个类可以实现多个接口,但只能继承一个抽象类。 6. Java中的异常处理机制是什么? 答:Java中的异常处理机制通过try-catch-finally语句块来实现。当可能发生异常的代码放在try块中,如果发生异常,则会被catch块捕获并进行处理,最后无论是否发生异常,都会执行finally块中的代码。 7. Java中的多线程是如何实现的? 答:Java中实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。通过重写Thread类的run()方法或实现Runnable接口的run()方法来定义线程的执行逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值