나는 그물에 논문의 대부분을 겪었어요,하지만, 난 여전히 우리가 upcasting을 사용해야하는 이유를 이해할 수 아니에요.
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
업 캐스트를 위해이 예제를 고려할 수 있습니다. 여기서 업 캐스트 사용은 무엇입니까? 모두
d
그리고
a
같은 결과를냅니다!
-
답변 # 1
-
답변 # 2
What's the need to use Upcasting in java?
용어가 맞는지 확실하지 않지만 여기에 다음과 같이 설명해야합니다.
와이즈 비즈실제로 중요한 시나리오는 다음과 같습니다.
upcasting
Doing a cast from a derived class to a more general base class.액세스 수정 자와 관련된 다른 미묘한 상황은 여기에 설명되어 있습니다. Java Oddity : 업 캐스트로 하루를 절약 할 수있는 방법
-
답변 # 3
업 캐스트는 예제에서 전혀 의미가 없습니다 (사실 수 없습니다) (있는 경우를 상상해보십시오) 개발자를 혼란스럽게하기 때문에 피해야합니다. 일부 IDE (IntelliJ)는이 줄에 경고를 표시하고 업 캐스팅 제거를 제안합니다)
편집 : Java의 모든 객체 메소드가 가상이기 때문에이 코드는 동일한 결과를 제공합니다. 즉, 대상 메소드가 참조 유형이 아닌 런타임에 객체의 실제 유형에 의해 감지됩니다.class A { } class B extends A { } public class Test { static void method(A a) { System.out.println("Method A"); } static void method(B b) { System.out.println("Method B"); } public static void main(String[] args) { B b = new B(); method(b); // "Method B" // upcasting a B into an A: method((A) b); // "Method A" } }
를 만들어보십시오 정적이며 어떤 일이 일어나는지 확인하십시오. -
답변 # 4
오버로드 된 메서드가 있고 aioobe가 쓴 것처럼 특수한 메서드를 호출하지 않으려는 경우 업 캐스팅이 필요할 수 있습니다. (
callme()
유형의 새 변수에 할당 할 수 있습니다 대신에.)업 캐스트가 필요한 또 다른 예는
A
와 관련이 있습니다. 연산자, 그러나 나는 지금 그것을 기억하지 못한다. 때로는 varargs-methods의 경우 업 캐스트가 필요합니다.?:
우리가
public void doSomething(Object... bla) {}
를 통과하려면 단일 매개 변수 (개체가 아닌 개별 매개 변수)로서, 다음 중 하나를 작성해야합니다.Object[] array
또는
doSomething((Object)array);
-
답변 # 5
시나리오를 고려하면 Bank는 이자율을 얻는 방법을 제공하는 클래스입니다. 그러나 은행에 따라 이자율이 다를 수 있습니다. 예를 들어 SBI, ICICI 및 AXIS 은행은 8.4 %, 7.3 % 및 9.7 %의 이자율을 제공하고 있습니다.
doSomething(new Object[]{array});
출력 :
class Bank{ float getRateOfInterest(){return 0;} } class SBI extends Bank{ float getRateOfInterest(){return 8.4f;} } class ICICI extends Bank{ float getRateOfInterest(){return 7.3f;} } class AXIS extends Bank{ float getRateOfInterest(){return 9.7f;} } class TestPolymorphism{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println("SBI Rate of Interest: "+b.getRateOfInterest()); b=new ICICI(); System.out.println("ICICI Rate of Interest: "+b.getRateOfInterest()); b=new AXIS(); System.out.println("AXIS Rate of Interest: "+b.getRateOfInterest()); } }
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
관련 자료
- javascript - RegExp를 할당 할 때 "new"라는 단어를 사용해야합니까?
- presto - PrestoSQL에서 슬러그의 역할은 무엇입니까
- c# - HttpClient가 앱 풀 ID를 사용하도록하는 방법
- powershell - 스크립트에서 AD 위치 정보를 추가해야합니다
- amazon web services - ECS와 동일한 VPC에서 SQS를 생성해야합니까?
- html - PL/SQL 코드에서 유로 기호를 사용하는 방법은 무엇입니까?
- python - 같은 페이지에 여러 개의 웹 소켓을 사용하는 방법?
- java - indexOf () 메소드에서 '%'를 사용하는 것은 무엇입니까?
- dart - 이 경우 팩토리 생성자를 사용하는 이유
- java - 앱 전체에서 "LocalBroadcastManager"를 사용하는 방법은 무엇입니까?
- assembly - MOVMSKB 작업의 사용법은 무엇입니까?
- threejs에"BufferGeometryUtilsjs"를 사용하는 방법?
- angular - ngfor에서 if 문을 어떻게 사용합니까?
- python - 나는리스트에서 튜플의 수를 알아야한다
- JavaScript로 인쇄 할 때 2 CSS를 동시에 사용하는 방법
- database - Oracle SQL에서 JOIN 연산자를 사용하는 방법은 무엇입니까?
- node.js - Express JS에서 applisten이 파일의 끝에 있어야합니까?
- css - 스패머가 사용하는 홀수 글꼴은 무엇입니까? 그들은 그걸 어떻게 햇어?
- shell - 줄에서 마지막 0을 제거해야합니다
- java - @Cacheput의 실제 사용 사례는 무엇입니까?
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- vue.js - axios를 사용하여 서버에 이미지를 업로드하는 방법
- python - 문자열에서 특정 문자 제거
대부분의 상황에서 명시적인 업 캐스트는 전적으로 불필요하며 효과가 없습니다.
예제에서 명백한 업 캐스트
다음으로 대체 될 수 있습니다 :
(Java 오브젝트 유형의 경우) 내재 된 업 캐스트의 목적은 정적 유형 정보를 "잊어"서 특정 유형의 오브젝트를보다 일반적인 유형이 필요한 상황에서 사용할 수 있도록하는 것입니다. 이는 컴파일 타임 유형 검사 및 과부하 해결에는 영향을 미치지 만 런타임 동작에는 영향을 미치지 않습니다.
정밀도가 손실 (기본 유형, 전환의 업 캐스팅 결과, 수 있고 어떤 경우에는, 예를 들면
<시간>long
->float
.)그러나 명백한 캐스트가 존재하면 진술/표현의 의미가 바뀌는 상황이있다
Java에서 업 캐스팅을 사용해야하는 상황 중 하나는 특정 메소드 재정의를 강제로 사용하려는 경우입니다. 예 : 오버로드 된 메소드가 있다고 가정하자 :
문자열이 있고 두 번째가 아닌 첫 번째 오버로드를 호출하려면 다음을 수행해야합니다.
관련 사례 :
캐스트 타입 없이는 코드가 컴파일되지 않는(이것이 업 캐스트로 간주되는지 확실하지 않지만 여기에 있습니다.)
두 번째 상황은 다양한 변수를 포함합니다 :
세번째 상황은 기본 숫자 유형에 대한 작업을 수행 할 때입니다. 예 :