클래스와 객체
프로세스 지향 및 객체 지향
- C 언어는 프로세스 지향적이며 프로세스에 중점을두고 문제를 해결하는 단계를 분석하고 함수 호출을 통해 문제를 점진적으로 해결합니다.
- JAVA는 객체 지향을 기반으로 객체에 초점을 맞추고 사물을 다른 객체로 분할하고 객체 간의 상호 작용으로 완성합니다.
- 프로세스 지향은 프로세스에 초점을 맞추고 전체 프로세스에 관련된 동작은 기능입니다.
- 객체 지향은 객체, 즉 참여 과정에 관련된 주제에 중점을 둡니다. 기능을 하나씩 연결하는 논리를 통해
[객체 지향 개념]
- 객체 지향은 문제에 대해 생각하는 방식이며 일종의 사고입니다. 예 : 개념 및 예. 이론과 실제. 이름과 현실 등등.
- 클래스는 객체 클래스에 대한 일반적인 용어입니다. 객체는 이러한 종류의 수정의 인스턴스입니다.
- 객체 지향의 이점 : 복잡한 것을 단순하게 만들려면 객체를 대면하십시오.
【객체 지향 디자인】
객체 지향 설계는 중요한 경험을 파악합니다 : 누가 데이터를 소유하고 누가 데이터를 조작 할 수있는 외부 방법을 제공하는지 (개인)! (수동 당사자는 데이터의 소유자이고 활성 당사자는 실행자입니다)
개발 중 : 개체를 찾고, 개체를 만들고, 개체를 사용하고, 개체 간의 관계를 유지합니다.
요약 : 객체 지향은 코드 (클래스)로 객관적인 세계에서 사물을 설명하는 방법입니다. 클래스는 주로 사물의 속성과 동작을 포함합니다.
클래스 및 클래스 인스턴스화
클래스는 객체 클래스에 대한 일반적인 용어입니다. 개체는 이러한 유형의 수정 인스턴스이며
클래스는 수많은 개체를 인스턴스화 할 수 있습니다.
아래에서는 클래스와 클래스의 인스턴스화를 이해하기 위해 예제를 사용합니다.
class Person {
public int age;//成员属性 实例变量 字段 属性
public String name;
public static String sex; //静态成员变量 方法区
public void eat() {
//成员方法
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
public static void func(){
System.out.println("静态成员方法");
}
}
public class Main{
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
person.eat();//成员方法调用需要通过对象的引用调用
person.sleep();
//产生对象 实例化对象
Person person2 = new Person();
Person person3 = new Person();
//静态成员变量和方法的调用
System.out.println(Person.sex);
Person.func();
}
}
멤버 변수 :
클래스 내부에 정의되고 메서드 외부는
객체 참조를 통해 액세스됩니다.
초기화되지 않은 경우 해당 값은 기본값 (기본값 0)입니다.
- 참조 유형 인 경우 값은 null (배열, 문자열 문자열 등 포함)입니다.
- 단순 유형 인 경우 값은 해당 유형에 해당하는 기본값입니다.
바이트 | 짧은 | int | 긴 | 흙손 | 더블 | 숯 | 부울 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0L | 0.0f | 0.0 | '\ u0000'16 진수 (0으로 취급 할 수도 있음) | 그릇된 |
동작 / 메소드 :
[eat () sleep ()]은 인스턴스 멤버 메소드입니다.
func ()는 정적 멤버 메소드입니다.
정적 멤버 변수 및 멤버 메서드에 액세스하는 방법
여기에서 볼 수 있듯이 정적 개체에 대한 개체를 인스턴스화 할 필요 가 없습니다 ! ! !
직접 전화
클래스 이름 정적 멤버 변수 / 정적 멤버 메서드
정적 요약 :
- 정적 멤버 속성 또는 정적 멤버 메서드의 경우 개체에 종속되지 않습니다 .
- 메서드 영역에 저장되는 정적 멤버 변수는 하나뿐입니다.
- 비 정적 데이터는 정적 메서드 내에서 액세스 할 수 없습니다.
인스턴스화 된 클래스의 저장 구조
멤버 변수를 초기화하는 방법
1. 내부 초기화 (클래스 내 공격적인 초기화)
2. 기본 초기화
3. 클래스 외부 초기화 (더 많이 사용됨)
public class Main{
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "星星";
person1.age = 20;
Person person2 = new Person();
person2.name = "狒狒";
person2.age = 40;
}
}
캡슐화
코드를 작성할 때 종종 클래스 구현 자와 클래스 호출 자라는 두 가지 역할이 있습니다. 캡슐화의 본질은 클래스 구현자가 클래스를 구현하는 방법을 알고있는 한 클래스 호출자가 클래스를 구현하는 방법을 이해할 필요가 없도록하는 것입니다. 수업을 사용하십시오.
이는 학급 사용자의 학습 및 사용 비용을 줄여 복잡성을 줄입니다.
두 개의 키워드 private / public은 "액세스 제어"를 의미합니다.
- public에 의해 수정 된 멤버 변수 또는 멤버 메서드는 클래스 호출자가 직접 사용할 수 있습니다.
- private에 의해 수정 된 멤버 변수 또는 멤버 메서드는 클래스 호출자가 사용할 수 없습니다.
예를 들면
class Person {
private String name = "张三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
- 이 시점에서 필드는 private로 꾸며졌고, 클래스의 호출자 (메인 메소드에서)는 직접 사용할 수 없으며 대신 show 메소드가 필요합니다. 이때 클래스 사용자는 이해할 필요가 없습니다. Person 클래스의 구현 세부 사항.
- 동시에 클래스 구현자가 필드 이름을 수정하면 클래스 호출자는 변경할 필요가 없습니다 (클래스 호출자는 이름 및 연령과 같은 필드에 대한 액세스 권한이 전혀 없음).
getter 및 setter 메서드
Getter : 속성 값을 가져 오는 방법
setter : 속성 값을 수정하는
방법이 두 가지 방법을 사용하여 속성에 액세스하는 목적을 달성하기 위해 클래스의 속성을 캡슐화합니다.
class Person {
private String name;//实例成员变量
private int age;
public void setName(String name){
//name = name;//不能这样写
this.name = name;//this引用,表示调用该方法的对象
}
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("caocao");
String name = person.getName();
System.out.println(name);
person.show();
}
}
이 키워드
방금 코드에서 setter 메서드를 볼 수 있습니다.
private String name;
public void setName(String name){
//name = name;//不能这样写
this.name = name;//this引用,表示调用该方法的对象
}
이것은 현재 개체 참조를 나타내며이를 사용하여 개체의 필드 및 메서드에 액세스 할 수 있습니다
.
- this.attribute; // 현재 객체의 속성에 액세스
- this. method; // 현재 객체의 메소드 호출
- this (); // 현재 객체의 생성 메소드를 호출합니다 (ps :는 첫 번째 줄에 있어야하며 내부에는 생성 메소드가 하나만있을 수 있습니다)
시공 방법
생성 메소드는 초기화 작업을 완료하기 위해 new 키워드를 사용하여 새 객체가 인스턴스화 될 때 자동으로 호출되는 특수 메소드입니다.
개체를 인스턴스화 / 만들기 위해 몇 단계가 있습니까?
Student stu = new Student (); //
두 단계 로 객체 인스턴스화
- 개체에 대한 메모리 할당
- 적절한 구성 방법을 호출하여 하나 이상의 구성 방법이 있음을 나타냅니다.
문법 규칙
- 메소드 이름은 클래스 이름과 동일해야합니다.
- 생성자에 반환 값 형식 선언이 없습니다.
- 각 클래스에는 적어도 하나의 구성 방법이 있어야합니다 (명확하게 정의되지 않은 경우 시스템에서 매개 변수없는 구성을 자동으로 생성합니다)
class Person {
private String name;//实例成员变量
private int age;
private String sex;
//默认构造函数 构造对象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//带有3个参数的构造函数
public Person(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main{
public static void main(String[] args) {
Person p1 = new Person();//调用不带参数的构造函数 如果程序没有提供会调用不带参数的构造函数
p1.show();
Person p2 = new Person("zhangfei",80,"男");//调用带有3个参数的构造函数
p2.show();
}
}
toString 메서드
Person person = new Person("caocao",19);
System.out.println(person);
참조를 인쇄하면 그는 기본적으로 toString 메서드를 호출하고 다음 결과를 실행
합니다. 원하는 결과를 인쇄하도록 toString 메서드를 다시 작성할 수 있습니다.
예를 들면 다음과 같습니다.
class Person {
private String name;
private int age;
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println("name:"+name+" " + "age:"+age);
}
//重写Object的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("caocao",19);
person.show();
System.out.println(person);
}
}
이렇게하면 원하는 내용에 따라 참조 인쇄가 출력됩니다.
익명 개체
익명 성은 단순히 이름이없는 객체를 의미합니다.
- 참조되지 않는 개체를 익명 개체라고합니다.
- 익명 개체는 개체를 만들 때만 사용할 수 있습니다.
- 개체가 한 번만 사용되는 경우 나중에 사용할 필요가 없으며 익명 개체 사용을 고려할 수 있습니다.
new Person("caocao",19).show();//通过匿名对象调用方法
기능 : 객체에 의존하지 않으며, 클래스 이름을 통해 속성 또는 메서드를 호출하기 만하면됩니다.
코드 블록
- 네이티브 코드 블록
- 정적 코드 블록
- 예제 코드 블록 / 구성 코드 블록
- 동기 코드 블록 (다중 스레드)
네이티브 코드 블록 : 메서드 의 코드 블록
public class Main{
public static void main(String[] args) {
{
//直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
정적 코드 블록 : 일반적으로 정적 멤버 속성을 초기화하는 데 사용됩니다.
//静态代码块
static {
count = 10;//只能访问静态数据成员
System.out.println("I am static init()!");
}
인스턴스 코드 블록 : 클래스에 정의 된 코드 블록 , 구성 코드 블록은 일반적으로 인스턴스 멤버 변수를 초기화하는 데 사용됩니다.
//实例代码块
{
this.name = "bit";
this.age = 12;
this.sex = "man";
System.out.println("I am instance init()!");
}
실행 순서
- 정적 코드 블록
- 예제 코드 블록
- 시공 방법