Java 기본 지식 -2, 객체 지향 기술

2 객체 지향 기술

2.1 객체 지향과 프로세스 지향의 차이점은 무엇입니까

  객체 지향은 오늘날 소프트웨어 개발 방법의 주류 방법 중 하나이며 데이터와 데이터 조작 방법을 상호 의존적 인 전체, 즉 객체로 통합합니다. 유사한 객체, 즉 클래스의 공통성을 추상화합니다. 클래스에있는 대부분의 데이터는이 클래스의 메서드에 의해서만 처리 될 수 있습니다. 클래스는 간단한 인터페이스를 통해 외부 세계와 관계를 맺고, 객체는 메시지를 통해 서로 통신합니다. 프로그램 흐름은 사용 중에 사용자가 결정합니다.

  프로세스 지향은 이벤트 중심의 개발 방식으로 위에서부터 아래로 순차적으로 실행하고 점진적으로 세분화하는 방식으로 프로그램 구조는 기능에 따라 여러 개의 기본 모듈로 나뉘어 트리 구조를 형성하며 관계가 비교적 간단합니다. , 기능은 상대적으로 독립적입니다. 각 모듈은 일반적으로 시퀀스, 선택 및주기의 세 가지 기본 구조로 구성됩니다. 모듈화의 특정 구현은 서브 루틴을 사용하는 것이며 프로그램 흐름은 이미 프로그램이 작성 될 때입니다.

面向对象与面向过程的不同之处
1)出发点不同:
  面向对象方法使用符合常规思维的方式来处理客观世界的问题,强调把问题域的要领直接映射到对象以及对象接口上 。
  面向过程方法强调的是过程的抽象画与模块化,是以过程为中心构造或处理客观世界问题。

2)层次逻辑不同:
  面向对象方法是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,用类的层次结构来体现类之间的继承和发展。
  面向过程方法处理问题的基本单位是能准确清晰的表达过程的模块,用模块层次结构来概括模块或模块间的关系与功能。

3)数据处理方式与控制程序方式不同
  面向对象的方法将数据与对应的代码封装成一个整体,原则行其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成。
  面向对象的方法控制程序方式是通过"事件驱动"来激活和运行程序的。
  面向过程方法是直接通过程序来处理数据,处理完毕即可显示处理结果
  面向过程方法控制程序是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制,调用与被调用的关系。

4)分析设计与编码转换方式不同
  面向对象方法贯穿于软件生命周期的分析、设计及编码,是一种平滑的过程,从分析到设计再到编码是采用一致性的模型表示,实现的是一种无缝连接。
  面向过程方法强调分析、设计以及编码之间按规则进行转换,贯穿于软件生命周期的分析、设计及编码,是一种有缝链接。



2.2 객체 지향의 특성은 무엇입니까

객체 지향의 주요 특징은 추상화, 상속, 캡슐화 및 다형성을 포함합니다.
抽象:
  抽象就是忽略一个主题中与当前目标无关的那些方面,以便于更充分地注意到与当前目标有关的方面。抽象并不打算了解全部问题,而是选择其中的一部分
  抽象包括两个方面:过程抽象   &  数据抽象
继承:
  继承是一种联结类的层次模型,并且允许和鼓励类的重用,提供了一种明确表述共性的方法。
  对象的一个新类可以从现有的类中派生,这个过程称为继承。
  新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
  派生类可以从它的基类那里继承方法和实例变量。
  并且派生类可以修改或增加新的方法使之更适合特殊的需要
封装:
  封装是指将客观事物抽象成类,每个类对自身数据和方法实行保护。
  类可以把自己的数据和方法只让可信任的类或者对象操作。
多态:
  多态是指允许不同类的对象对同一消息作出响应,多态包括参数多态和包含多态。
  多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好解决了应用程序函数同名问题。



2.3 객체 지향 개발의 장점은 무엇입니까?

객체 지향의 많은 점이 있으며 주로 세 가지 점이 있습니다. 이해하십시오.
1) 높은 개발 효율성
2)
소프트웨어 의 견고성 보장 3) 소프트웨어의 높은 유지 보수성 보장


2.4 상속이란?

  상속은 클래스를 연결하는 계층 적 모델이며 클래스의 재사용을 허용하고 장려하며 공통성을 명확하게 표현하는 방법을 제공합니다. 새로운 객체 클래스는 기존 클래스에서 파생 될 수 있으며이 프로세스를 상속이라고합니다. 새 클래스는 원래 클래스의 특성을 상속하고 새 클래스를 원래 클래스의 파생 클래스 (하위 클래스)라고하며 원래 클래스를 새 클래스의 기본 클래스 (상위 클래스)라고합니다. 파생 클래스는 기본 클래스에서 메서드와 인스턴스 변수를 상속 할 수 있습니다. 그리고 파생 클래스는 특별한 요구에 더 적합하도록 새 메서드를 수정하거나 추가 할 수 있습니다.
  상속은 extends 키워드를 통해 이루어지며 형식은 다음과 같습니다. class subclass name extends parent class name.

继承主要有以下几大特性:
  1)Java语言不支持多重继承,但是可以通过实现多个接口来达到多重继承的目的
  2)子类只能继承父类的非私有成员变量与方法
  3)当子类中定义的成员变量和父类中定义的成员变量同名时,子类成员变量会覆盖父类成员变量,而不会继承。
  4)当子类中的方法与父类中的方法有相同函数签名时,子类将会覆盖父类的方法。



2.5 구성과 상속의 차이점은 무엇입니까

구성과 상속은 객체 지향에서 코드를 재사용하는 두 가지 방법입니다.

组合是指在新类里面创建原有类的对象,重复利用原有类的功能。
继承是面向对象主要特性之一,它允许设计人员根据其他类的实现来定义一个的实现。
组合和继承都允许在新类中设置子对象:
   组合式显式的
   继承是隐式的
组合和继承存在着对应关系:
   组合中的整体类和继承中的子类对应
   组合中的局部类和继承中的父类对应

상속과 구성은 코드 재사용을 달성 할 수 있는데, 실제 개발에서 어떻게 사용하기로 선택합니까? 정상적인 상황에서는 두 가지 원칙을 따릅니다.
1) 두 클래스 간의 관계가 "is-a"관계가 아니면 상속을 사용하기가 쉽지 않습니다. 너무 많은 상속이 코드의 유지 보수성을 파괴하기 때문에 상속은 코드 재사용을 위해 순수하게 사용되어서는 안됩니다. 부모 클래스가 수정되면 상속 된 모든 하위 클래스에 영향을 미치므로 프로그램 유지 관리의 어려움과 비용이 증가합니다.

2) 상속은 다형성을 달성하기 위해 사용되어서는 안됩니다. 클래스간에 "is-a"관계가없는 경우 인터페이스와 구성을 구현하여 동일한 목표를 달성 할 수 있습니다. 디자인 패턴의 전략 패턴은이 점을 잘 보여줄 수 있으며, 인터페이스 및 구성 방법은 상속 방법보다 확장 성이 우수합니다.

Java 언어는 단일 상속 만 지원하므로 두 개 이상의 클래스를 동시에 상속하려는 경우 Java 언어에서는 불가능합니다. 동시에 Java 언어에서 너무 많은 상속을 사용하면 클래스의 내용이 부풀어집니다. 따라서 Java 언어로 컴포지션을 사용할 수 있다면 상속을 사용하지 마십시오.


2.6 다형성의 실현 메커니즘은 무엇입니까

낙태는 객체 지향 프로그래밍에서 코드 재사용을위한 중요한 메커니즘입니다. 이는 동일한 작업이 다른 객체에 대해 작동 할 때 다른 의미를 가지게되어 다른 결과를 생성한다는 것을 의미합니다.
예 :
동일한 "+"연산을 수행합니다.
2 + 1 정수 더하기
"2"+ "1" 을 달성하려면 결과가 3입니다. 문자열 스 플라이 싱을 달성하려면 결과가 21입니다.

다형성의 두 가지 주요 증상이 있습니다.

1)方法的重载(overload):重载是指同一个类中有多个同名方法,但这些方法有不同参数,因此在编译时可以选择调用哪个方法。
						 它是一种编译时多态,重载可以被看作一个类中的方法多态性。
						 
2)方法的覆盖(override):子类可以覆盖父类的方法,因此同样的方法会在子类与父类中有着不同的表现形式。
						 在Java语言中,,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。
						 接口的引用变量也可以指向其实现类的实例对象。 

메서드 커버리지에 의해 달성 된 다형성은 런타임 다형성이라고도 할 수 있습니다
.

//父类方法
public class Father {
    
    
    public void normal() {
    
    
        System.out.println("父类方法");
    }
}

//子类方法
public class Son extends Father {
    
    
    public void normal() {
    
    //这里覆盖了父类的同名方法
        System.out.println("子类方法");
    }
}

//多态表现
public class Performance
{
    
    
    public static void main(String args[]) {
    
    
        Father father;//定义一个父类变量
        Son son;//定义一个子类变量
        father= new Son();//创建子类对象
        father.normal();//调用子类方法
        // son = new Father();子类的变量不能创建父类对象
        son = new Son();
        son.normal();
    }
}

연산의 결과는 다음과 같습니다.
Subclass method
Subclass method

이것은 변수가 선언 된 클래스에 관계없이 변수가 객체 일 때 어떤 메서드가 호출되는지를 의미합니다.

멤버 변수는 다형성을 얻을 수 없으며, 부모 클래스 또는 하위 클래스 멤버 변수의 값을 사용하여 생성되는 객체의 유형에 의존하지 않지만 컴파일
요약 에서 결정되는 변수 정의 유형에 따라 달라집니다 :
Java 제공 다형성에는 두 가지 메커니즘이 있습니다. 하나는 컴파일 타임 다형성이고 다른 하나는 런타임 다형성입니다.
컴파일 타임 다형성은 메서드 오버로딩을 통해 달성됩니다.
런타임 다형성은 메서드 커버리지를 통해 달성됩니다.


2.7 오버로딩과 덮어 쓰기의 차이점은 무엇입니까?

오버로딩과 오버라이드는 Java 다형성의 다른 표현입니다.

오버로딩은 클래스의 다형성을 표현한 것으로, 한 클래스에서 여러 개의 명명 된 메서드를 정의하는 것으로, 매개 변수 수나 매개 변수 유형이 서로 다릅니다.

1)重载重载是通过不同方法参数来区分的,例如不同的参数个数,不同的参数类型或者不同的参数顺序。
2)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。
3)如果基类的访问类型为private,那么就不能在派生类对其进行重载;如果派生类也定义了一个同名函数,那么这只是一个新方法,而达不到重载的效果。

재정의는 기본 클래스 함수를 포함하는 원시 클래스 함수를 할당하는 것입니다. 메서드를 덮어 쓴 다음 다시 작성하여 다른 효과를 얻으십시오.

1)派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。
2)派生类中的覆盖方法返回值必须和基类中被覆盖的方法的返回值相同。
3)派生类中的覆盖方法所抛出的异常必须和基类(或是其子类)中被覆盖的方法所抛出的异常一致。
4)基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,而并没有对基类的方法进行覆盖。
과부하와 덮음의 주요 차이점 :
1)覆盖是子类与父类之间的关系,是垂直关系
   重载是同一个类中方法之间的关系,是水平关系
   
2)覆盖只能有一个方法或者是一对方法产生关系
   重载是多个方法之间的关系

3)覆盖要求参数列表相同
   重载要求参数列表不同

4)覆盖关系中,调用方法体是根据对象的类型来决定
   重载关系中是根据调用时的实参表和形参表来选择方法体的。



2.8 추상 클래스와 인터페이스의 유사점과 차이점은 무엇입니까?

  클래스에는 추상 메서드가 포함되어 있으며이 클래스는 추상 클래스입니다. Java 언어에서 클래스 또는 클래스의 일부 메서드를 추상으로 선언하여 클래스가 추상 클래스임을 나타낼 수 있습니다 (abstract는 속성이 아닌 클래스 또는 메서드를 수정하는 데만 사용할 수 있음).
  인터페이스는 메서드 모음을 나타냅니다 . , 인터페이스의 모든 메소드 메소드 본문이 없으며 Java 언어에서는 인터페이스 키워드 인터페이스를 통해 구현됩니다.
  추상 클래스와 인터페이스는 모두 추상 클래스의 정의를 지원하는 두 가지 메커니즘으로,이 둘은 매우 유사하며 때로는 상호 교환이 가능합니다. 그러나 동시에 큰 차이가 있습니다.

추상 클래스와 인터페이스의 유사점 :

1) 都不能被实例化
2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法才能被实例化。

추상 클래스와 인터페이스의 차이점 :

1) Java8之前接口只能定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中的方法。
   抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
   
2)接口需要实现(implement),一个类可以实现多个接口
   抽象类只能继承(extends),一个类只能继承一个抽象类

3)接口强调特定功能的实现,设计理念是 " has - a " 的关系。
   抽象类强调所属关系,设计理念是 " is - a " 的关系。

4)接口中定义的成员变量默认为 public static final,只能由静态的不能被修改的数据成员,而且必须给其赋初始值,其所有成员都是public,abstract的,而且只能被这两个关键词修饰。
   抽象类可以有自己的数据成员变量,也可以由非抽象的成员方法,而且丑类中的成员变量,默认为default,也可以定义为public、protected和private。这些成员变量可以在子类中重新被定义,也可以重新赋值。

5)接口被用于实现比较常用的功能,便于日后维护或者添加删除方法
   抽象类更倾向于充当公共类角色,不适用于日后对里面的代码进行修改
인터페이스는 인터페이스를 상속 할 수 있고, 추상 클래스는 인터페이스를 구현할 수 있으며, 추상 클래스는 구체적인 클래스를 상속 할 수도 있습니다. 추상 클래스는 정적 기본 메서드를 가질 수 있습니다.


2.9 내부 클래스는 무엇입니까

  자바 언어에서는 하나의 클래스를 다른 클래스 안에 정의 할 수 있으며, 클래스의 클래스를 내부 클래스라고하고 외부 클래스를 외부 클래스라고합니다. 이 경우 내부 클래스는 외부 클래스의 멤버로 간주 할 수 있습니다.
  내부 카테고리는 여러 유형으로 나눌 수 있으며 네 가지 주요 유형이 있습니다.

  1) 정적 내부 클래스 : 외부 클래스의 인스턴스에 의존하지 않고 인스턴스화 할 수있는 static으로 선언 된 내부 클래스입니다. 정적 내부 클래스는 외부 클래스와 동일한 이름을 가질 수 없으며 외부 클래스의 일반 멤버 변수에 액세스 할 수 없으며 외부 클래스의 정적 멤버 및 정적 메서드 (개인 유형 포함)에만 액세스 할 수 있습니다.

public class outerClass {
    
    
    //静态内部类
    static class innerClass {
    
    
    }
}

  2) 멤버 내부 클래스 : 비 정적 내부 클래스로, 이러한 속성과 메서드가 정적이든 비 정적이든 관계없이 외부 클래스의 속성과 메서드를 자유롭게 참조 할 수 있습니다. 그러나 인스턴스에 바인딩되면 정적 속성과 메서드를 정의 할 수 없습니다. 외부 클래스를 인스턴스화 한 후에 만 ​​내부 클래스를 인스턴스화 할 수 있습니다.

public class outerClass {
    
    
    //成员内部类(普通内部类)
    class innerClass {
    
    
    }
}

  3) 로컬 내부 클래스 : 코드 블록에 정의 된 클래스 , 범위는 위치하는 코드 블록이며 내부 클래스에서 가장 적게 사용되는 유형입니다. 로컬 내부 클래스는 로컬 변수와 동일하며 public, protected, private 및 static으로 수정할 수 없으며 메서드에서 final로 정의 된 로컬 변수에만 액세스 할 수 있습니다.

public class outerClass {
    
    
    public void menberFunction() {
    
    
        //局部内部类
        class innerClass {
    
    
        }
    }
}

  4) 익명 내부 클래스 : 익명 내부 클래스는 클래스 이름이없는 내부 클래스로 class, extends, implement 키워드는 사용할 수 없으며 생성자가 없으며 다른 클래스를 상속하거나 다른 인터페이스를 구현해야합니다. 익명의 내부 클래스는 코드를 더 간결하게 만들지 만 가독성을 떨어 뜨립니다. 일반적으로 GUI 프로그래밍에서 이벤트 처리를 구현하는 데 사용됩니다.

public class MyFrame extends Frame {
    
    
    public MyFrame() {
    
    
        //匿名内部类
        addWindowListener(new WindowAdapter() {
    
    
            public void windowClosing(WindowEvent e){
    
    
                dispose();
                System.exit(0);
            }
        });
    }
}

익명 내부 클래스를 사용할 때 다음 원칙을 염두에 두어야합니다.

1)匿名内部类不能有构造函数
2)匿名内部类不能定义静态成员、方法和类
3)匿名内部类不能是public、protected、private、static
4)只能创建匿名内部类的一个实例
5)一个匿名内部类一定是在new的后面,这个匿名内部类一定继承一个父类或者实现一个接口
6)因为匿名内部类为局部内部类,所以局部内部类的局限对其生效



2.10 이것과 슈퍼의 차이점은 무엇입니까

이것은 현재 인스턴스 객체를 가리키는 데 사용되며 매우 중요한 기능 중 하나는 객체의 멤버 변수와 메서드의 형식 매개 변수를 구별하는 것입니다. 메서드의 형식이 멤버 변수의 동일한 이름에 참여하면 멤버 변수를 덮어 씁니다.
예 :

class People {
    
    
    String name;

    public People(String name) {
    
    
        this.name = name;
    }
}

super는 부모 클래스의 메서드 또는 멤버 변수에 액세스하는 데 사용할 수 있습니다. 하위 클래스의 메소드 또는 멤버 변수가 상위 클래스와 이름이 같으면 상위 클래스의 메소드 또는 멤버 변수도 재정의합니다. 상위 클래스의 메소드 또는 멤버 변수에 액세스 할 수 있도록하려면, 액세스 할 때는 super 키워드 만 사용할 수 있습니다.
예:

class Hobby{
    
    
    String name;
    void value() {
    
    
       name = "游戏";
    }
}
  
class Game extends Hobby{
    
    
    String name;
    void value() {
    
    
    name = "LOL";
    super.value();      //调用父类的方法
    System.out.println(name);
    System.out.println(super.name);
    }
  
    public static void main(String[] args) {
    
    
       Game g=new Game();
       c.value();
       }
}

결과 :
LOL
게임







참고 :

이 문서는 책 "자바 프로그래머 인터뷰 필기 시험 책"에서 파생됩니다

. 단지 내 학습 과정의 기록으로는

내가 관련 링크를 찾을 수 없기 때문에 원래 입력합니다.

않으면

아무것도가 잘못하시기 바랍니다 연락처 나 이 책은 즉시 삭제 하겠습니다 . 자세한 설명과 포괄적 인 지식 포인트가있는 흰색으로 매우 유용합니다. 현재이 책을 기반으로 공부하고 있으며 더 많은 지식 포인트를 차례로 기록 할 것입니다.

추천

출처blog.csdn.net/HF0705/article/details/114086281