作者:深海鳗鱼666
链接:https://www.jianshu.com/p/e43c72e62112
一面问的 Java 和 Android 基础
等下把二面的答案写出来,希望能帮助后来人。
此外GitHub和博客维护好很重要,像我这种demo随手写,随手删的人直接GG。。
1、dart是值传递还是引用传递
main(){
Test a = new Test(5);
print("a的初始值为:${a.value}");
setValue(a);
print("修改后a的值为: ${a.value}");
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(Test s){
print("修改value为100");
s.value = 100;
}
输出结果为:
a的初始值为:5
修改value为100
修改后a的值为:100
main(){
int s = 6;
setValue(s);
print(s); //输出6,而不是7
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(int s){
s += 1;
}
你看,这输出的不是6吗,在dart中一切皆为对象,如果是引用传递,那为什么是6啊。
答案是这样的,在 setValue()方法中,参数s实际上和我们初始化int s = 6的s不是一个对象,只是他们现在指的是同一块内存区域,然后在setValue()中调用s += 1的时候,这块内存区域的对象执行+1操作,然后在堆(类比java)中产生了一个新的对象,s再指向这个对象。所以s参数只是把main函数中的s的内存地址复制过去了,就比如java中的:
public class Test {
public static void main(String[] args) {
Test a = new Test();
Test b = a;
b = new Test();
}
}
我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住dart中一切都是对象。
2、Widget 和 element 和 RenderObject 之间的关系
首先我详细说下当时的情景,面试官问我 Widget 和 Element 之间是不是一对多的关系,如果是增加一个 Widget 之后,这个关系又是什么。
这部分还是没有很好地答案,现在只是一个猜想,如果添加了一个widget,Element树遍历后面所有的Element看类型是否发生改变,有的话再重建RenderObject。
Element和Widget之间应该还是一对一的关系,因为每个Widget的context都是独一无二的。等想好了再写上去吧。
3、widget树的root节点
4、mixin extends implement之间的关系
Flutter Dart mixins 探究
Flutter Dart语法(1):extends 、 implements 、 with的用法与区别
同样参考小德的文章
深入了解Flutter的isolate(1) ---- 事件循环(event loop)及代码运行顺序
深入了解Flutter的isolate(2) --- 创建自己的isolate
深入了解Flutter的isolate(3) --- Flutter的thread model(线程模型)
深入了解Flutter的isolate(4) --- 使用Compute写isolates
main(){
Tree tree = new Tree(1);
tree..test1 = 1..test2 =5;
print(tree.test1);
print(tree.test2);
}
class Tree{
int value;
int test1 = 2;
int test2 = 3;
Tree(int a){
this.value = a;
}
}
先来一段官方文档
await-for
As every Dart programmer knows, the for-in loop plays well with iterables. Similarly, the await-for loop is designed to play well with streams.
Given a stream, one can loop over its values:
Every time an element is added to the stream, the loop body is run. After each iteration, the function enclosing the loop suspends until the next element is available or the stream is done. Just like await expressions, await-for loops can only appear inside asynchronous functions.
大概意思就是 await for是不断获取stream流中的数据,然后执行循环体中的操作。
Stream
stream = new Stream .fromIterable(['不开心', '面试', '没', '过']); main() async{
print('上午被开水烫了脚');
await for(String s in stream){
print(s);
}
print('晚上还没吃饭');
}
上午被开水烫了脚
不开心
面试
没
过
晚上还没吃饭
Stream
stream = new Stream .fromIterable(['不开心', '面试', '没', '过']); main(){
print('上午被开水烫了脚');
stream.listen((s) { print(s); });
print('晚上还没吃饭');
}
输出为
上午被开水烫了脚
晚上还没吃饭
不开心
面试
没
过
其实面试官还是很 nice 的,第一次见到活的大佬。。大佬对 flutter 和 dart 的研究真的很深入,远不是我这种只会调 api 的人可以比拟的。
主要还是我一个半月没使用过flutter了,然后之前问其他大佬要不要准备Flutter,大佬们说不用,以前看的很多东西都忘的差不多了。
哎,还是自己准备不充分,或者开始大佬问我的时候直接回答忘得差不多了,应该就能过了吧。
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责! 马上到来的秋招,以及金九银十面试季(预热期),赶快去为自己的面试做足准备吧!
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
开发者全社区