8/18 部分八股
1.怎么理解面向对象和它的三大特性:
面向对象可以理解为把世间万物都抽象为一个对象,包含他的属性和他的方法。在java中就是通过各对象之间的协作来完成程序的运行。三大特性分别就是封装、继承、多态,封装指的是隐藏对象的内部实现细节,只暴露外部接口,有安全性和扩展性吧。继承就是子类复用父类的结构和方法,可以使类之间的层级结构更清晰。多态就是多个实例对象对同一信息作出不同的反应,使用不同实例作出不同操作,体现在接口,和父子类之间,也是扩展性吧。
说到多态我记得是有4个方面体现的:
1.重载 同一个类里面方法同名但是参数列表不同,编译器就根据参数来实现对应的方法。
2.重写 体现在父子类之间,方法和参数列表都要相同,子类能够提供父类方法的实现,根据对象的类型确定调用哪个方法。
3.接口实现
其实我开始不太明白这个 就是 ,多个类可以实现同一个接口,并且用接口类型的引用来调用这些类的方法。 就比如接口是Animal 他有个方法bark() , 我用一个cat来实现这个接口, 开始的时候用这个Animal a = new cat(); a.bark() 他也能运行出来meow 。
开始的时候我其实是迷惑的,就是不是说接口不能实例化new吗,后来我去问ai才知道Animal 只是引用类型,真正 new 创建出来的对象是 cat 的实例, **接口类型的变量接收它任意实现类的实例。接口本身不能造对象,但是可以当 “变量类型”,就像父类引用指向子类对象(多态),接口这里也是多态。
需要注意的是 使用接口引用接收对象时,只能调用接口里面声明过的方法。这是需要注意的 。
所以最后就按小林code里面解释 就是:多个类可以实现一个接口,并且通过接口类型的引用来调用这些类的方法 ,其实我认为就补充一下 这些类的方法指的是接口里面定义过,然后这些类重写的方法。
4.就是向上转型和向下转型:
其实从刚刚这个接口实现里面 可以用接口引用类型去接收不同实现类的对象,就可以看出向上转型的影子, 就比如List
向下转型其实就是将父类引用转为子类类型。
说到这个new 就不得不提下 抽象类和接口
他们都不能new实例化对象 ,但是 抽象类他有实例构造器,接口他没有。
抽象类是继承,所以子类在进行new时候其实是调用父类的实例构造器来new的,但是接口他其实只是一种能力,所以他作为引用对象new时候只能是实现类的构造方法。
想到这里我又在想 这个既然你
这个接口作为引用对象new时候只能是实现类的构造方法。 为什么我还要多绕一层来创呢?
其实这样体现了向上转型
1.面向接口编程,解耦合,屏蔽具体实现
如果不用引用接口 我们就必须写死具体类
public void test(Cat cat){
cat.bark();
}
那如果想要狗的话 就用重载一个
如果用接口呢
//参数是接口类型,只要实现这个接口的所有类,全都可以传进来
public void test(Animal animal){
animal.bark();
}
这时候我们直接
test(new Cat());
test(new Dog());
//以后新增Tiger类,只要implements Animal,直接丢进去,方法一行不用改
test(new Tiger());
接口引用最大价值:方法只依赖抽象接口,不依赖具体实现类。
- 可以统一存放不同实现类对象
//数组类型是接口Animal1
Animal1[] arr = {new Cat(), new Dog()};
for (Animal1 item : arr) {
item.bark(); //猫叫、狗叫,自动执行各自重写的逻辑
}
- 限制访问,只暴露约定好的行为
class Cat implements Animal{
@Override
public String bark() {return "cat";}
public void climbTree(){ //猫自己独有的方法
System.out.println("爬树");
}
}
Cat c = new Cat();
c.bark();
c.climbTree(); //✅可以调用猫全部方法
Animal a = new Cat();
a.bark(); //✅接口规定的方法,可以调用
a.climbTree(); //❌看不见,编译报错!
业务含义:我只需要动物会叫这个能力,我不需要暴露爬树这个猫特有功能。
接口引用帮你做访问控制,对外只暴露出契约里该有的方法,屏蔽内部多余细节。

浙公网安备 33010602011771号