면접 자매 편 5:흔 한 자바 기초 면접 문제

목차
  • [1、
  • [2、
  • 3.계승 과 다 형 에 관 한
  • 4,finally
  • 5,effective final
  • 6,어느 것 이 나의 속성 인지
  • 시리즈
  • 면접 자매 편 1:보 잘 것 없 는 자바 함정 문제
  • 면접 자매 편 2:재 미 있 는 논리 면접 문제 공유
  • 면접 자매 편 3:흔히 볼 수 있 는 자바 계산 오류
  • 면접 자매 편 4:흔히 볼 수 있 는 자바 다 중 스 레 드 면접 문제
  • 면접 자매 편 5:흔 한 자바 기초 면접 문제
  • 3.계승 과 다 태 에 대하 여\color{7f1A8A}3.계승 과 다 태 에 대하 여 3.계승 과 다 태 에 대하 여
  • 아래 의 운행 결 과 는 무엇 을 출력 해 야 합 니까?
  • class A {
         
        public String show(D obj) {
         
            return ("A and D");
        }
        public String show(A obj) {
         
            return ("A and A");
        }
    }
    class B extends A {
         
        public String show(B obj) {
         
            return ("B and B");
        }
        @Override
        public String show(A obj) {
         
            return ("B and A");
        }
    }
    class C extends B {
         }
    
    class D extends B {
         }
    
    class Test {
         
        public static void main(String[] args) {
         
            A a1 = new A();
            A a2 = new B();
            B b = new B();
            C c = new C();
            D d = new D();
    
            System.out.println("1--" + a1.show(b));
            System.out.println("2--" + a1.show(c));
            System.out.println("3--" + a1.show(d));
            System.out.println("4--" + a2.show(b));
            System.out.println("5--" + a2.show(c));
            System.out.println("6--" + a2.show(d));
            System.out.println("7--" + b.show(b));
            System.out.println("8--" + b.show(c));
            System.out.println("9--" + b.show(d));
        }
    }
    
  • 결과
  • 1--A and A
    2--A and A
    3--A and D
    4--B and A
    5--B and A
    6--A and D
    7--B and B
    8--B and B
    9--A and D
    
  • 원인 분석:
  • 이 문 제 를 풀 려 면 아버지 류 가 자 류 를 인용 하 는 대상 의 구체 적 인 실현 에 대해 깊 은 이 해 를 가 져 야 한다.그 방법 들 이 덮어 지고 다시 쓸 수 있다 는 것 을 이해 해 야 한다.
  • 이 문제 의 구체 적 인 원인 분석 에 따 르 면 대상 을 대상 으로 프로 그래 밍 패키지,계승,다 중

  • 4、f i n a l l y\color{7f1A8A}4、finally 4、finally 에 대하 여
  • 문제 설명:다음 세 개의 문장의 출력 을 알 수 있 습 니까?
  • 문장 1:
  • public class testFinally {
         
        public static String ou = "";
        public static void main(String[] args) {
         
            foo(1);
            System.out.println(ou);
        }
        public static void foo(int i) {
         
            try {
         
                if (i == 1) throw new Exception();
                ou += "1";
            } catch (Exception e) {
         
                ou += "2";
                return;
            } finally {
         
                ou += "3";
            }
            ou += "4";
        }
    }
    
      :
    23
    
  • 문장 2:
  • public class testFinally {
         
        public static void main(String[] args) {
         
            System.out.println(foo(1));
        }
        public static String foo(int i) {
         
            String ou = "";
            try {
         
                if (i == 1) throw new Exception();
                ou += "1";
            } catch (Exception e) {
         
                ou += "2";
                return ou;
            } finally {
         
                ou += "3";
            }
            ou += "4";
            return ou;
        }
    }
    
      :
    2
    
  • 문장 3:
  • public class vuhu {
         
        public static void main(String[] args) {
         
            int u = 0;
            foo(u);
            System.out.println(u);
        }
        public static void foo(int ou) {
         
            try {
         
                if (1 == 1) throw new Exception();
                ou += 1;
            } catch (Exception e) {
         
                ou += 2;
                return;
            } finally {
         
                ou += 3;
            }
            ou += 4;
        }
    }
    
      :
    0
    
  • 결론:
  • 문장 1 과 문장 2 는 static,정적 대상 은 전역 적 으로 생존 하고 값 을 기록 할 수 있 음 을 나타 낸다.
  • 문장 2 와 문장 3 은 다음 과 같다.
  • 자바 는 값 전달 이 고 새로운 스 택 프레임 에 들 어가 면 값 이 적용 되 지 않 으 며 서로 전달 되 지 않 습 니 다.
  • try,catch,finally 간 의 호출 은 스 택 프레임 이 아 닐 수 있 기 때문에 값 전달 이 나타 나 지 않 았 습 니 다.



  • 5,e f e c t i v e f i n a l\\color{7f1A8A}5,effectivefinal 5,effectivefinal 에 대하 여
  • 아래 의 운행 결 과 는 무엇 을 출력 해 야 합 니까?
  • public class ljtest{
         
        public static void main(String[] args) {
         
            for (int i = 0; i < 10; i++) {
         
                Thread t = new Thread(new Runnable() {
         
                    @Override
                    public void run() {
         
                        System.out.println("thread name:" + Thread.currentThread().getName() + ",i:" + i);
                    }
                });
            }
        }
    }
    
  • 기대 하 는 것:
  • thread name:Thread-0,i:0
    thread name:Thread-1,i:1
    thread name:Thread-2,i:2
    thread name:Thread-4,i:4
    thread name:Thread-6,i:6
    thread name:Thread-8,i:8
    thread name:Thread-9,i:9
    thread name:Thread-3,i:3
    thread name:Thread-5,i:5
    thread name:Thread-7,i:7
    
  • 실제:
  •        ,           i       。
    
  • 원인 분석
  • 내부 클래스 가 외부 클래스 의 구성원 변 수 를 방문 할 때 이 변 수 는 바 꿀 수 없 기 때문에 그 는 안정 적 이 어야 한다.final 이 든 effective final 이 든.
  • final 은 변경 할 수 없다 는 뜻 입 니 다.effective final 은 차이 가 많 지 않 으 면 변경 할 수 없 는 것 과 같 습 니 다.만약 에 한 변수 가 사용 하기 전에 여러 번 할당(두 번)이 나타 나 지 않 았 다 면 기본 값 은 형식적인 불가 변수 입 니 다.

  • 해결 방법
  • 변 수 를 final 또는 effective final 로 바 꿉 니 다.예 를 들 어 for 순환 에 int temp=i 를 추가 합 니 다.(출력 문 에 있 는 i 도 temp 으로 바 꿔 야 합 니 다)
  • 현재 int temp=i;게다가 결 과 는 기대 가 그 럴 까?
  • 은 라인 이 전혀 작 동 하지 않 았 기 때문에 할 수 없다.
  • 해결 방법:
  • 방법 1:for 순환 내 에서 모든 스 레 드 뒤에 t.start()를 추가 합 니 다.
  • 방법 2:스 레 드 탱크 에 맡 겨 관리 하면 t.start()를 추가 할 필요 가 없습니다.


  • 6.어느 것 이 나의 속성 입 니까?\color{7f1 A8A}6.어느 것 이 나의 속성 입 니까?6.어느 것 이 나의 속성 입 니까?
  • 아래 의 운행 결 과 는 무엇 을 출력 해 야 합 니까?
  • public class ljtest {
         
        public final int value = 4;//5.     
        public void dop(){
         
            int value = 6;//4.     
            Runnable r = new Runnable() {
         
                public final int value = 9;//3.     
                @Override
                public void run() {
         
                    int value = 10;//2.     
                    System.out.println(this.value);//1.  this
                }
            };
            r.run();
        }
    
        public static void main(String[] args) {
         
            ljtest f = new  ljtest();
            f.dop();
        }
    }
    
  • 출력
  • 9
    
  • 코드 의 주석 부분 을 보고 다음 과 같은 상황 을 고려 하여 출력 은 각각 무엇 입 니까?
  • //1.이거 빼 고
  • .
  • //2.
  • //3.
  • //4.
  • //5.본 줄
  • 주석 을 달 아 주세요.
  • 출력 결과
  • 1.수출:10
  • 2,수출:9
  • 3,수출:6
  • 4,수출:4
  • 5,출력:컴 파일 오류
  • 결론:
  • 내부 류 의 속성 과 값
  • 을 구분 합 니 다.

    좋은 웹페이지 즐겨찾기