추상 클래스에는 생성자가 있을 수 있습니까?
추상 클래스에는 생성자가 있을 수 있습니까?
그렇다면 어떤 용도로 사용할 수 있습니까?
예, 추상 클래스에는 생성자가 있을 수 있습니다.다음 사항을 고려하십시오.
abstract class Product {
int multiplyBy;
public Product( int multiplyBy ) {
this.multiplyBy = multiplyBy;
}
public int mutiply(int val) {
return multiplyBy * val;
}
}
class TimesTwo extends Product {
public TimesTwo() {
super(2);
}
}
class TimesWhat extends Product {
public TimesWhat(int what) {
super(what);
}
}
★★★★★★★★★★★★★★★★.Product
추상적이고 생성자가 있습니다. 클래스 체적인 the the the the the theTimesTwo
에는 값 2를 하드 코드하는 생성자가 있습니다. 클래스 체적인 the the the the the theTimesWhat
에는 발신자가 값을 지정할 수 있는 컨스트럭터가 있습니다.
추상 생성자는 클래스 제약 조건이나 클래스 설정에 필요한 최소 필드 등의 불변수를 적용하기 위해 자주 사용됩니다.
메모: 부모 추상 클래스에는 기본(또는 no-arg) 생성자가 없으므로 서브 클래스에서 사용되는 생성자는 부모 생성자를 명시적으로 호출해야 합니다.
다음 상황 중 하나에 해당하는 경우 추상 클래스에서 생성자를 정의합니다.
- 서브클래스의 인스턴스화가 실제로 이루어지기 전에 (추상 클래스의 필드에 대한) 초기화를 수행하려고 합니다.
- 추상 클래스에서 최종 필드를 정의했지만 선언 자체에서 초기화하지 않았습니다. 이 경우 이러한 필드를 초기화할 생성자가 있어야 합니다.
주의:
- 둘 이상의 생성자를 정의할 수 있습니다(다른 인수를 사용하여).
- 보호되는 모든 컨스트럭터를 정의할 수 있습니다(어차피 공개는 무의미합니다).
- 서브클래스 컨스트럭터는 추상클래스의 1개의 컨스트럭터를 호출할 수 있습니다.그것은 (추상클래스에 서브클래스 컨스트럭터가 없는 경우) 그것을 호출해야 할 수도 있습니다.
어떤 경우에도 컨스트럭터를 정의하지 않으면 컴파일러가 자동으로 생성된다는 것을 잊지 마십시오(이것은 공개적이고 인수도 없으며 아무것도 하지 않습니다).
예, 생성자를 가질 수 있으며 다른 클래스의 생성자와 동일하게 정의되어 동작합니다.추상 클래스는 직접 인스턴스화할 수 없고 확장만 가능하므로 항상 하위 클래스의 생성자에서 사용할 수 있습니다.
예! 추상 클래스에는 생성자가 있을 수 있습니다!
예. 클래스를 추상 클래스로 정의할 때 인스턴스화할 수 없지만 추상 클래스에 생성자를 가질 수 없습니다.각 추상 클래스에는 해당 추상 클래스의 추상 메서드를 구현하는 구체적인 하위 클래스가 있어야 합니다.
서브클래스의 오브젝트를 작성하면 대응하는 상속 트리의 모든 컨스트럭터가 위에서 아래로 접근하여 호출됩니다.추상 클래스에도 같은 경우가 적용됩니다.추상 클래스의 오브젝트를 만들 수는 없지만 추상 클래스의 구체적이고 하위 클래스의 오브젝트를 만들면 추상 클래스의 생성자가 자동으로 호출됩니다.따라서 추상 수업에서 컨스트럭터를 사용할 수 있습니다.
참고: 비추상 클래스는 추상 메서드를 가질 수 없지만 추상 클래스는 비추상 메서드를 가질 수 있습니다.이유는 컨스트럭터와 비슷하지만 자동으로 호출되지 않고 super()를 호출할 수 있습니다.또한 추상적인 생성자만한 것은 전혀 말이 안 되기 때문에 없습니다.
할 수 있을 뿐만 아니라, 항상 그래.지정하지 않으면 다른 클래스와 마찬가지로 기본 no arg 컨스트럭터가 됩니다.실제로 네스트된 클래스와 익명 클래스를 포함한 모든 클래스는 기본 생성자를 지정하지 않으면 기본 생성자를 얻습니다(익명 클래스의 경우 지정할 수 없으므로 항상 기본 생성자를 얻습니다).
생성자를 가진 추상 클래스의 좋은 예는 달력 클래스입니다.Calendar.getInstance()를 호출하면 Calendar 객체를 얻을 수 있지만 보호되는 컨스트럭터도 있습니다.해당 생성자가 보호되는 이유는 하위 클래스만 해당 생성자를 호출할 수 있기 때문입니다(또는 동일한 패키지의 클래스가 추상적이기 때문에 해당되지 않습니다).GregoryCalendar는 캘린더를 확장하는 클래스의 예입니다.
추상 클래스에는 생성자가 있을 수 있지만 추상 클래스의 개체를 만들 수는 없습니다. 그러면 해당 생성자를 어떻게 사용하시겠습니까?
문제는 서브클래스의 추상 클래스를 상속할 때 서브클래스의 슈퍼(값) 메서드를 통해 값을 해당(추상) 생성자에게 전달할 수 있지만 생성자는 상속하지 않는다는 것입니다.
따라서 Super를 사용하여 추상 클래스의 생성자에 값을 전달할 수 있으며, 내가 기억하는 한 그것은 메서드 또는 생성자의 첫 번째 문이어야 합니다.
네, 추상 클래스 생성자는 일반적으로 모든 서브클래스에 공통되는 초기화 이벤트에 대한 슈퍼콜에 사용됩니다.
물론 추상 클래스에는 생성자가 있을 수 있습니다.일반적으로 클래스 생성자는 필드를 초기화하기 위해 사용됩니다.따라서 추상 클래스 생성자는 추상 클래스의 필드를 초기화하기 위해 사용됩니다.자식 클래스의 인스턴스화를 수행하기 전에 추상 클래스의 특정 필드를 초기화하려면 추상 클래스의 생성자를 제공해야 합니다.추상 클래스 생성자를 사용하여 모든 자식 클래스와 관련된 코드를 실행할 수도 있습니다.이것에 의해, 코드의 중복이 방지됩니다.
추상 클래스의 인스턴스를 만들 수는 없지만 추상 클래스에서 파생된 클래스의 인스턴스를 만들 수는 있습니다.따라서 파생 클래스의 인스턴스가 생성되면 상위 추상 클래스 생성자가 자동으로 호출됩니다.
레퍼런스:이 문서
좋은 답변이 많지만, 저는 제 2센트를 드리고 싶습니다.
생성자가 개체를 빌드하지 않습니다.개체를 초기화하는 데 사용됩니다.
예, Abstract 클래스에는 항상 생성자가 있습니다.자체 생성자를 정의하지 않으면 컴파일러는 Abstract 클래스에 기본 생성자를 제공합니다.위의 내용은 중첩, 추상, 익명 등 모든 클래스에 적용됩니다.
(인터페이스와 달리) 추상 클래스에는 초기화가 필요한 비최종 비정적 필드가 포함될 수 있습니다.이를 위해 추상 클래스에 자체 생성자를 작성할 수 있습니다.단, 이 경우 기본 생성자는 없습니다.
public abstract class Abs{
int i;
int j;
public Abs(int i,int j){
this.i = i;
this.j = j;
System.out.println(i+" "+j);
}
}
추상 클래스 이상으로 확장할 때는 각 생성자에서 super를 명시적으로 호출해야 하므로 주의하십시오.컨스트럭터의 첫 번째 행은 super()를 호출합니다.명시적으로 super()를 호출하지 않으면 Java가 대신 호출합니다.다음 코드는 컴파일되지 않습니다.
public class Imp extends Abs{
public Imp(int i, int j,int k, int l){
System.out.println("2 arg");
}
}
다음 예시와 같이 사용해야 합니다.
public class Imp extends Abs{
public Imp(int i, int j,int k, int l){
super(i,j);
System.out.println("2 arg");
}
}
네, 추상 클래스에는 생성자가 있을 수 있습니다!
다음은 추상 클래스에서 생성자를 사용하는 예입니다.
abstract class Figure {
double dim1;
double dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
// area is now an abstract method
abstract double area();
}
class Rectangle extends Figure {
Rectangle(double a, double b) {
super(a, b);
}
// override area for rectangle
double area() {
System.out.println("Inside Area for Rectangle.");
return dim1 * dim2;
}
}
class Triangle extends Figure {
Triangle(double a, double b) {
super(a, b);
}
// override area for right triangle
double area() {
System.out.println("Inside Area for Triangle.");
return dim1 * dim2 / 2;
}
}
class AbstractAreas {
public static void main(String args[]) {
// Figure f = new Figure(10, 10); // illegal now
Rectangle r = new Rectangle(9, 5);
Triangle t = new Triangle(10, 8);
Figure figref; // this is OK, no object is created
figref = r;
System.out.println("Area is " + figref.area());
figref = t;
System.out.println("Area is " + figref.area());
}
}
정답을 맞힌 것 같아요.
다음 사항을 고려하십시오.
abstract class Product {
int value;
public Product( int val ) {
value= val;
}
abstract public int multiply();
}
class TimesTwo extends Product {
public int mutiply() {
return value * 2;
}
}
슈퍼클래스는 추상적이고 생성자가 있습니다.
다음 예시는 javafuns에서 설명한 바와 같습니다.
public abstract class TestEngine
{
private String engineId;
private String engineName;
public TestEngine(String engineId , String engineName)
{
this.engineId = engineId;
this.engineName = engineName;
}
//public gettors and settors
public abstract void scheduleTest();
}
public class JavaTestEngine extends TestEngine
{
private String typeName;
public JavaTestEngine(String engineId , String engineName , String typeName)
{
super(engineId , engineName);
this.typeName = typeName;
}
public void scheduleTest()
{
//do Stuff
}
}
구체적인 클래스에서 구체적인 타입 Fnord의 컨스트럭터 선언은 두 가지를 효과적으로 노출시킨다.
코드가 Fnord 인스턴스 생성을 요청할 수 있는 수단
구축 중인 Fnord에서 파생된 유형의 인스턴스가 모든 베이스 클래스 피쳐의 초기화를 요구할 수 있는 수단.
아마도 이 두 가지 능력을 개별적으로 제어할 수 있는 수단이 있어야 하지만, 모든 구체적인 유형에 대해 하나의 정의가 두 가지 모두를 가능하게 할 것이다.비록 첫 번째 능력이 추상적인 수업에는 의미가 없지만, 두 번째 능력은 추상적인 수업에도 다른 어떤 수업에도 의미가 있고, 따라서 그 선언도 필요하고 유용하다.
네, 그렇습니다.그리고 상속된 클래스의 인스턴스가 생성되면 추상 클래스의 생성자가 호출됩니다.예를 들어, 다음은 유효한 Java 프로그램입니다.
// An abstract class with constructor
abstract class Base {
Base() { System.out.println("Base Constructor Called"); }
abstract void fun();
}
class Derived extends Base {
Derived() { System.out.println("Derived Constructor Called"); }
void fun() { System.out.println("Derived fun() called"); }
}
class Main {
public static void main(String args[]) {
Derived d = new Derived();
}
}
위 코드의 출력입니다.
기본 생성자 호출된 파생 생성자 호출됨
예. Abstract 클래스 변수 초기화에 대해 이미 언급한 대로 하나를 추가할 수 있습니다.그러나 명시적으로 선언하지 않으면 "컨스트럭터 체인"을 작동시키기 위한 암묵적인 컨스트럭터가 있습니다.
추상 클래스는 인스턴스화할 수 없지만 생성자를 가질 수 있습니다.그러나 추상 클래스에서 정의된 생성자는 이 추상 클래스의 구체적인 클래스를 인스턴스화하는 데 사용할 수 있습니다.JLS 확인:
클래스 인스턴스 생성 식을 사용하여 추상 클래스의 인스턴스를 생성하려고 하면 컴파일 시 오류가 발생합니다.
추상 클래스가 아닌 추상 클래스의 서브 클래스는 인스턴스화될 수 있으며, 그 결과 추상 클래스에 대한 생성자가 실행되며, 따라서 그 클래스의 인스턴스 변수에 대한 필드 이니셜라이저가 실행된다.
추상 클래스는 모든 액세스 수식자의 변수를 가질 수 있으므로 기본값으로 초기화해야 하므로 생성자가 필요합니다.자식 클래스를 인스턴스화하면 추상 클래스의 생성자가 호출되고 변수가 초기화됩니다.
반대로 인터페이스에는 상수 변수만 포함되어 있기 때문에 이미 초기화되어 있습니다.인터페이스에는 컨스트럭터가 필요 없습니다.
생성자 체인을 달성하기 위해 추상 클래스에 생성자가 있습니다.컴파일러는 Super() 문을 서브클래스 컨스트럭터 안에 보관하고 슈퍼클래스 컨스트럭터를 호출합니다.추상 클래스의 컨스트럭터가 없으면 Java 규칙이 위반되어 컨스트럭터 체인을 실행할 수 없습니다.
예, 추상 클래스에는 생성자가 있을 수 있습니다.추상 클래스에서 원하는 수만큼 생성자를 오버로드할 수 있습니다.이러한 계약자는 추상 클래스를 확장하는 객체의 초기 상태를 초기화하는 데 사용할 수 있습니다.객체는 생성자가 아닌 "new" 키워드로 생성되므로 추상 클래스의 객체를 만들 수 없습니다.서브클래스의 오브젝트 상태를 초기화하기 위해서만 사용됩니다.
클래스의 생성자의 목적은 필드를 초기화하는 데 사용되지만 "빌드 개체"에는 사용되지 않습니다.추상 SuperClass의 새 인스턴스를 생성하려고 하면 컴파일러가 오류를 표시합니다.그러나 추상 클래스 Employee를 상속하고 변수를 설정하여 해당 생성자를 사용할 수 있습니다. 아래 예를 참조하십시오.
public abstract class Employee {
private String EmpName;
abstract double calcSalary();
Employee(String name) {
this.EmpName = name;// constructor of abstract class super class
}
}
class Manager extends Employee{
Manager(String name) {
super(name);// setting the name in the constructor of sub class
}
double calcSalary() {
return 0;
}
}
package Test1;
public class AbstractClassConstructor {
public AbstractClassConstructor() {
}
public static void main(String args[]) {
Demo obj = new Test("Test of code has started");
obj.test1();
}
}
abstract class Demo{
protected final String demoValue;
public Demo(String testName){
this.demoValue = testName;
}
public abstract boolean test1();
}
class Test extends Demo{
public Test(String name){
super(name);
}
@Override
public boolean test1() {
System.out.println( this.demoValue + " Demo test started");
return true;
}
}
네, 여느 수업과 같습니다.생성자를 가질 수 있으며 기본 클래스의 개체를 만든 후 호출됩니다.
언급URL : https://stackoverflow.com/questions/260666/can-an-abstract-class-have-a-constructor
'sourcecode' 카테고리의 다른 글
최초의 C 컴파일러는 어떻게 작성되었습니까? (0) | 2022.08.09 |
---|---|
Vue.js는 "npm 빌드 실행"하지만 Vue.js는 DOM/작업에 구속되지 않음 (0) | 2022.08.09 |
Vue CLI 3 및 Firebase 서비스 워커 등록 (0) | 2022.08.09 |
첫 번째 밀리초 동안의 콘텐츠 점프 (0) | 2022.08.09 |
Vue.js img src 변수와 텍스트 연결 (0) | 2022.08.09 |