[Java 기초] 객체 지향 프로그래밍에 대한 자세한 설명(1부) 실습

앞에 쓰여진


        안녕하세요 여러분, 저는 컴퓨터 지식을 좋아하는 소프트웨어 공학을 전공하는 [ Lin-Xiaobai ] 학생입니다 . 모두가 함께 배우고 발전 할 수 있기를 바랍니다 ! 저는 대학생 이고 전문적인 수준이 제한되어 있습니다. 실수결함을 발견하면 저를 수정하십시오! 다들 감사 해요! ! !

        제 글에 관심이 있는 형제자매님들은 작은 손에 인색하지 마시고 좋아요 와 팔로우 부탁드립니다 ! ❤❤❤ 사랑해요 여러분! ! !


목차

앞에 쓰여진

[객체지향 프로그래밍(on)지식에 대한 자세한 설명]

클래스 인스턴스화

암호

프로그래밍 질문 1

프로그래밍 질문 2

방법 사용

메서드 선언 및 호출

메소드 오버로딩

출력을 작성

출력을 작성

다음 코드를 실행한 결과는?

객체 지향

객체지향의 3대 특징에 대한 설명

public, private, protected 범위와 기본적으로 쓰지 않는 경우의 차이

결점을 찾다

Java 메모리 관리의 가비지 수집(이해)

인터뷰 질문들:

건설자

생성자 생성자를 재정의할 수 있는지 여부

Box 클래스를 생성하고 큐브의 길이, 너비 및 높이를 나타내는 세 가지 변수를 정의하고 큐브의 부피를 찾는 방법을 정의하는 프로그램입니다. 주어진 차원의 정육면체의 부피를 찾는 객체를 생성합니다. (매개변수 없는 생성자와 매개변수화된 생성자 제공)

원 유형 정의

이름, 색상 및 나이 속성을 사용하여 Dog 클래스를 디자인하고 이러한 속성을 초기화하는 생성자를 정의하고 해당 정보를 표시하는 출력 메서드 show()를 정의합니다.

휴먼 클래스 작성

자동차 클래스 작성:

다음 프로그램을 실행한 결과는 다음과 같습니다.

매개변수 전달 정보

연습 하나

운동 2

연습 3

연습 4

다섯 번째 연습

다음 코드를 실행한 결과는?

짧은 답변

발문


[객체지향 프로그래밍(on)지식에 대한 자세한 설명]

[Java Basics] 객체지향 프로그래밍(1부)①

이 글은 [자바 기초] 객체 지향 프로그래밍(1부)②에 대한 심도 있는 이해를 제공합니다.


클래스 인스턴스화

암호

각각 String, String, int, int 및 double 유형인 이름, 성별, 연령, ID 및 점수 속성을 포함하는 Student 클래스를 작성하십시오.

String 타입을 리턴하는 say 메소드가 클래스에 선언되어 있고, 메소드 리턴 정보에는 모든 속성 값이 포함되어 있습니다.

다른 StudentTest 클래스의 기본 메서드에서 Student 개체를 만들고 say 메서드와 모든 특성에 액세스하고 호출 결과를 출력합니다.

/*
 * 代码实现
编写一个Student类,包含name、gender、age、id、score属性,分别为String、String、int、int、double类型。
类中声明一个say方法,返回String类型,方法返回信息中包含所有属性值。
在另一个StudentTest类中的main方法中,创建Student对象,并访问say方法和所有属性,并将调用结果打印输出。
 */

public class StudentTest {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.name = "Tom";
		stu.age = 10;
		stu.gender = "man";
		stu.score = 65.5;
		stu.id = 123456;
		String info = stu.say();
		System.out.println(info);
	}
}

public class Student {
	String name;
	String gender;
	int age;
	int id;
	double score;
	
	public String say(){
		return "姓名是:" + name + ", 性别是:" + gender + ", 年龄是:" 
				+ age + ", id是:" + id + "分数是:" + score;
	}
}


프로그래밍 질문 1

이름, 나이, 아내 속성으로 Husband Husband 클래스 정의

이름, 나이, 남편 속성으로 아내 아내 클래스 정의

남편 클래스에는 남편의 이름, 나이, 아내의 이름과 나이를 표시할 수 있는 getInfo 메서드가 있습니다.

아내 클래스에는 아내의 이름, 나이, 남편의 이름과 나이를 표시할 수 있는 getInfo 메서드가 있습니다.

테스트 클래스를 정의하고 아내와 남편 개체를 만들고 테스트합니다.

/*
 * 
 * 编程题1
定义一个丈夫Husband类,有姓名、年龄、妻子属性
定义一个妻子Wife类,有姓名、年龄、丈夫属性
丈夫类中有一个getInfo方法,其中,能显示自己的姓名,年龄,和他的妻子的姓名,年龄
妻子类中有一个getInfo方法,其中,能显示自己的姓名,年龄,和她的丈夫的姓名,年龄
定义一个测试类,创建妻子和丈夫对象,然后测试
 */
public class Test {
	public static void main(String[] args) {
		Husband husband = new Husband("Tom", 22);
		Wife wife = new Wife("Susan", 20);
		husband.setWife(wife);
		wife.setHusband(husband);
		System.out.println(husband.getInfo());
		System.out.println(wife.getInfo());
	}
}

public class Husband {
	private String name;
	private int age;
	private Wife wife;

	public Husband(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setWife(Wife wife) {
		this.wife = wife;
	}

	public Wife getWife() {
		return wife;
	}

	public String getInfo() {
		return "丈夫叫:" + name + "年龄是:" + age + "妻子叫:" + wife.getName() + "年龄是:" + wife.getAge();
	}
}

public class Wife {
	private String name;
	private int age;
	private Husband husband;

	public Wife(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setHusband(Husband husband) {
		this.husband = husband;
	}

	public Husband getHusband() {
		return husband;
	}

	public String getInfo() {
		return "妻子叫:" + name + "年龄是:" + age + "丈夫叫:" + husband.getName() + "年龄是:" + husband.getAge();
	}
}


프로그래밍 질문 2

속성이 있는 은행 계좌 클래스 Account를 정의합니다: 카드 번호 cid, 잔액 잔액, 사용자 고객에 속함   

은행 계좌 클래스 Account에는 다음과 같은 메서드가 있습니다.

(1) getInfo(), 반환 문자열 유형, 카드의 상세 정보 반환

(2) 인출 방법인 인출(), 매개 변수는 사용자가 직접 설계하고 인출에 성공하면 true를 반환하고 실패하면 false를 반환합니다.

(3) 저축 방법 save(), 파라미터는 직접 설계하여 돈이 저축에 성공하면 true를 반환하고 실패하면 false를 반환합니다.

그 중 Customer 클래스에는 이름, 주민등록번호, 연락처, 집 주소 등의 속성이 있고, Customer 클래스에는 String 타입을 반환하고 개인 정보를 반환하는 say() 메서드가 있다.

테스트 클래스 Bank에 은행 계좌 클래스 객체와 사용자 클래스 객체를 생성하고 정보를 설정 및 표시합니다.

/*
 * 定义银行账户类Account,有属性:卡号cid,余额balance,所属用户Customer   
银行账户类Account有方法:
(1)getInfo(),返回String类型,返回卡的详细信息
(2)取钱方法withdraw(),参数自行设计,如果取钱成功返回true,失败返回false
(3)存钱方法save(),参数自行设计,如果存钱成功返回true,失败返回false
   
其中Customer类有姓名、身份证号、联系电话、家庭地址等属性
    Customer类有方法say(),返回String类型,返回他的个人信息。

在测试类Bank中创建银行账户类对象和用户类对象,并设置信息,与显示信息
 */

public class Bank {
	public static void main(String[] args) {
		Customer c = new Customer("Tom", 1001, 123456789, "地球");
		Account a = new Account(123456, 1000, c);
		System.out.println(c.say());
		System.out.println(a.getInfo());
		System.out.println(a.save(1000));
		System.out.println(a.getInfo());
		System.out.println(a.withdraw(300));
		System.out.println(a.getInfo());
	}
}

public class Account {
	private long cid;
	private int balance;
	private Customer customer;
	
	public long getCid() {
		return cid;
	}

	public void setCid(long cid) {
		this.cid = cid;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public String getInfo(){
		return "卡号是:" + cid + "\n" + "余额是:" + balance;
	}

	public Account(long cid, int balance, Customer customer) {
		super();
		this.cid = cid;
		this.balance = balance;
		this.customer = customer;
	}

	public boolean withdraw(int m){
		if(m>=balance){
			return false;
		}else{
			balance -= m;
			return true;
		}
	}
	
	public boolean save(int m){
		if(m<=0){
			return false;
		}else{
			balance += m;
			return true;
		}
	}
}

public class Customer {
	private String name;
	private long id;
	private long phone;
	private String address;
	
	public Customer(String name, long id, long phone, String address) {
		this.name = name;
		this.id = id;
		this.phone = phone;
		this.address = address;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public long getPhone() {
		return phone;
	}

	public void setPhone(long phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String say(){
		return "姓名:" + name +  "\n" + "身份证号:" + id + "\n" + 
				"电话号码:" + phone + "\n" + "地址:" + address;
	}
}


방법 사용

哪个选项和show()方法重载
class Demo{
    void show(int a,int b,float c){}
}

A.void show(int a,float c,int b){}//yes

B,void show(int a,int b,float c){}//一模一样。不可以出现在同一个类中。

C.int show(int a,float c,int b){return a;}//yes。

D.int show(int a,float c){return a;}//yes


메서드 선언 호출

(1) 실린더 유형을 선언하고,

(2) 속성 선언: 하단 가장자리의 반경 및 높이

(3) 신고 방법:

A: 방법의 기능: 실린더의 세부 사항을 방법으로 인쇄합니다.

원기둥 밑면의 반지름은 xxx, 높이는 xxx, 밑면의 넓이는 xxx, 부피는 xxx입니다.

B: 메서드의 기능: 하단 영역 반환

C: 방법의 기능: 반환 볼륨

D: 방법의 기능: 원통 하단 가장자리의 반경과 높이 지정

E: 방법의 기능: 실린더 하단 가장자리의 반경과 높이에 값을 할당하고 할당 결과를 반환합니다.

아래쪽 가장자리의 반지름 또는 높이가 <=0이면 할당이 실패하고 false를 반환하고 그렇지 않으면 true를 반환합니다.

(4) 및 테스트

//声明圆柱体
class Cylinder{
	double radius;//底边半径
	double height;//高
	
	/*
	A:方法的功能:在方法中打印圆柱体的详细信息
	圆柱体的底边的半径是xxx,高是xxx,底面积是xxx,体积是xxx。
	*/
	void printDetails(){
		//double area = Math.PI * radius * radius;//底面积
		//double volume = area * height;//体积
		
		//System.out.println("圆柱体的底边的半径是" + radius +" ,高是" + height + ",底面积是"+ area +",体积是"+volume +"。");
	
		//调用本类的方法
		System.out.println("圆柱体的底边的半径是" + radius +" ,高是" + height + ",底面积是"+ getArea() +",体积是"+getVolume() +"。")
	}
	
	//B:方法的功能:返回底面积 
	double getArea(){
		double area = Math.PI * radius * radius;//底面积
		return area;
	}
	
	//C:方法的功能:返回体积
	double getVolume(){
		
		//double area = Math.PI * radius * radius;//底面积
		//double volume = area * height;//体积
		//return volume;
		
		double volume = getArea() * height;//体积
		return volume;
	}
	
	//D:方法的功能:为圆柱体的底边的半径,和高赋值
	void setValue(double r, double h){
		radius = r;
		height = h;
	}
	
	/*
	E:方法的功能:为圆柱体的底边的半径,和高赋值,并返回赋值的结果
	如果底边的半径或高为<=0,赋值失败,返回false,否则返回true
	*/
	boolean setRadiusAndHeight(double r, double h){
		if(r<=0 || h<=0){
			return false;
		}
		//radius = r;
		//height = h;
		setValue(r,h);
		return true;
	}
	
}

class TestMethodExer{
	public static void main(String[] args){
		//1、创建对象
		Cylinder c = new Cylinder();
		//c.radius = 2.0;
		//c.height = 2;
		c.setValue(2.0,2);
		
		c.printDetails();
		
		System.out.println("底面积: " + c.getArea());
		System.out.println("体积: " + c.getVolume());
		
		boolean flag = c.setRadiusAndHeight(3.0, 5);
		if(!flag){// 如果flag = false, !flag结果就是true,条件成立
			System.out.println("赋值失败");
		}else{
			c.printDetails();
		}
	}
}


메소드 오버로딩

메소드 오버로딩(overload)은 ________를 만족해야 합니다.

A. 다른 클래스에 정의된 메소드 B. 동일한 유형에 정의된 메소드

C. 메서드 이름이 동일해야 합니다. D. 반환 유형이 동일해야 합니다.

E. 매개변수는 달라야 합니다. F. 매개변수는 같을 수 있습니다.

답: 기원전


출력을 작성

class Demo {
    public static void main(String[] args) {
        show(0);
        show(1);
    }

    public static void show(int i) {
        switch(i) {
            default:
            i+=2;
            case 1:
            i+=1;
            case 4:
            i+=8;
            case 2:
            i+=4;
        }
        System.out.println("i="+i);
    }
}

답: i=15

           i=14


출력을 작성

class Demo {
    public static void main(String[] args) {
        int x = 1;
        for(show('a'); show('b') && x<3; show('c')) {
            show('d'); 
            x++;
        }
    }

    public static boolean show(char ch) {
        System.out.print(ch);
        return true;
    }
}

답: abdcbdcb


다음 코드를 실행한 결과는?

public class Test1 {
	public static boolean foo(char c) {
		System.out.print(c);
		return true;
	}

	public static void main(String[] args) {
		int i = 0;
		for (foo('A'); foo('B') && (i < 2); foo('C')) {
			i++;// 1 2
			foo('D');
		}
	}
}

답: ABDCBDCB


객체 지향

객체지향의 3대 특징에 대한 설명

답변: 객체 지향에는 캡슐화, 상속 및 다형성이라는 세 가지 주요 특징이 있습니다. (4번 답을 원하시면 추상화 기능을 추가하시면 됩니다.)

1. 상속:

상속은 클래스를 연결하는 계층적 모델이며 클래스의 재사용을 허용하고 권장하며 공통성을 명시적으로 표현할 수 있는 방법을 제공합니다. 객체의 새 클래스는 클래스 상속이라는 프로세스인 기존 클래스에서 파생될 수 있습니다. 새 클래스는 원래 클래스의 특성을 상속받으며, 새 클래스를 원래 클래스의 파생 클래스(하위 클래스)라고 하고, 원본 클래스를 새 클래스의 기본 클래스(부모 클래스)라고 합니다. 파생 클래스는 기본 클래스에서 메서드와 인스턴스 변수를 상속할 수 있으며 클래스는 특별한 요구 사항에 더 적합하도록 새 메서드를 수정하거나 추가할 수 있습니다.

2. 캡슐화:

캡슐화는 프로세스와 데이터를 둘러싸는 것이며 데이터에 대한 액세스는 정의된 인터페이스를 통해서만 가능합니다. 객체 지향 컴퓨팅은 실제 세계가 보호된 인터페이스를 통해 다른 객체에 액세스하는 완전히 자율적이고 캡슐화된 객체의 집합으로 표현될 수 있다는 기본 개념에서 시작됩니다.

3. 다형성:

다형성은 서로 다른 클래스의 객체가 동일한 메시지에 응답하도록 허용하는 것을 말합니다. 다형성에는 파라메트릭 다형성과 포함 다형성이 포함됩니다. 다형성 언어는 유연성, 추상화, 동작 공유 및 코드 공유의 장점이 있으며 응용 프로그램 기능의 동일한 이름 문제를 매우 잘 해결합니다.

4. 추상화:

추상화는 현재 목표와 관련된 측면에 더 많은 주의를 기울이기 위해 현재 목표와 관련이 없는 주제의 측면을 무시하는 것입니다. 추상화는 모든 문제를 이해하려는 것이 아니라 일부만 선택하고 당분간 일부 세부 사항을 사용하지 않습니다. 추상화에는 두 가지 측면이 포함됩니다. 하나는 프로세스 추상화이고 다른 하나는 데이터 추상화입니다.


public, private, protected 범위와 기본적으로 쓰지 않는 경우의 차이

Java에서 일반적으로 사용되는 액세스 제한 수정자는 public, private, protected 및 do not write이며 작성되지 않은 수정자는 기본 수정자 또는 친숙한 수정자라고도 합니다.

1. private에 의해 수정된 멤버 변수 및 함수는 클래스 자체 및 내부 클래스에서만 액세스할 수 있습니다.

2. 보호된 수정 멤버 변수 및 함수는 클래스 자체, 하위 클래스 및 동일한 패키지의 클래스에서 액세스할 수 있습니다.

3. 공개적으로 수정된 멤버 변수 및 함수는 클래스, 하위 클래스, 동일한 패키지의 클래스 및 기타 모든 클래스에서 액세스할 수 있습니다.

4. 기본적으로(작성되지 않음) 일종의 패키지 액세스에 속합니다. 즉, 클래스 자체와 동일한 패키지의 클래스에서 액세스할 수 있습니다.


결점을 찾다

public class Something {
   void doSomething () {
       private String s = "";
       int l = s.length();
   }
}

문제가 있습니까?

답변: 거짓입니다. 로컬 변수 앞에는 액세스 수정자(private, public 및 protected)가 올 수 없습니다.


Java 메모리 관리의 가비지 수집(이해)

할당: 해당 메모리 공간은 JVM에 의해 자동으로 할당됩니다.

해제: JVM에서 제공하는 가비지 수집 메커니즘이 메모리 공간을 자동으로 해제합니다.

가비지 컬렉션 메커니즘(GC: Garbage Collection): 가비지 개체가 차지하는 힙 메모리를 회수합니다. Java의 가비지 수집 메커니즘은 JVM에서 제공하는 기능으로 유휴 시간 동안 불규칙한 방식으로 별도의 시스템 수준 가비지 수집 스레드에 의해 동적으로 수집됩니다.

Garbage Object : 참조가 더 이상 가리키지 않는 객체입니다.


인터뷰 질문들:

질문: 프로그램에서 가비지를 수집하도록 가비지 수집 메커니즘에 알릴 수 있습니까?

예, System.gc() 또는 Runtime.getRuntime().gc()를 호출합니다.

다시 묻기: System.gc(); 또는 Runtime.getRuntime().gc();을 호출한 직후에 가비지 수집이 수행됩니까?

아니요, 이 호출은 가비지 수집 메커니즘을 즉시 시작하여 재활용을 시작하지는 않지만 가비지 수집 메커니즘의 작동 속도를 높입니다.

public class TestGC {
	public static void main(String[] args)throws Exception {
		for (int i = 0; i < 10; i++) {
			MyClass m = new MyClass();//这里本次循环完,本次创建的对象就成为垃圾了
			System.out.println("创建第" + (i+1) + "的对象:" + m);
		}
		
		//通知垃圾回收机制来收集垃圾
		System.gc();
		
		//为了延缓程序结束
		for (int i = 0; i < 10; i++) {
			Thread.sleep(1);
			System.out.println("程序在继续....");
		}
	}
}
class MyClass {
	//这个方法是垃圾回收机制在回收它的对象时,自动调用,理解成对象留临终遗言的方法
	public void finalize() {
		System.out.println("轻轻的我走了.....");
	}
}


건설자

생성자 생성자를 재정의할 수 있는지 여부

대답: 생성자는 상속될 수 없으므로 Override는 재정의할 수 없지만 Overload는 오버로드할 수 있습니다.


Box 클래스를 생성하고 큐브의 길이, 너비 및 높이를 나타내는 세 가지 변수를 정의하고 큐브의 부피를 찾는 방법을 정의하는 프로그램입니다. 주어진 차원의 정육면체의 부피를 찾는 객체를 생성합니다. (매개변수 없는 생성자와 매개변수화된 생성자 제공)

public class Box {
	private int length;
	private int width;
	private int height;

	public Box() {
		super();
	}

	public Box(int length, int width, int height) {
		super();
		this.length = length;
		this.width = width;
		this.height = height;
	}

	public int getarea() {
		return length * width * height;
	}
}


원 유형 정의

원의 둘레를 표시하는 방법을 제공합니다.

원의 넓이를 표시하는 방법 제공

매개변수가 없는 생성자와 매개변수화된 생성자를 제공합니다.

public class Circle {
	private int r;

	public Circle() {
		super();
	}

	public Circle(int r) {
		super();
		this.r = r;
	}

	public void getCircumferent() {
		System.out.println("圆的周长为:" + 2 * Math.PI * r);
	}

	public void getArea() {
		System.out.println("圆的面积为:" + Math.PI * r * r);
	}
}


이름, 색상 및 나이 속성을 사용하여 Dog 클래스를 디자인하고 이러한 속성을 초기화하는 생성자를 정의하고 해당 정보를 표시하는 출력 메서드 show()를 정의합니다.

매개변수가 없는 생성자와 매개변수화된 생성자를 제공합니다.

public class Dog {
	String name;
	String color;
	int age;

	public Dog() {
		super();
	}

	public Dog(String name, String color, int age) {
		super();
		this.name = name;
		this.color = color;
		this.age = age;
	}

	public void show() {
		System.out.println("狗狗的名字为:" + name + "狗狗的颜色为:" + color + "狗狗的年龄为:" + age);
	}
}


휴먼 클래스 작성

속성: 이름, 성별, 나이, 매개변수 없는 생성자와 매개변수화된 생성자 제공

방법 : (1) 자기소개 방법 (2) 먹는 방법

객체 "장산" 생성

public class Person {
	private String name;
	private char gender;
	private int age;

	public Person() {
		super();
	}

	public Person(String name) {
		super();
		this.name = name;
	}

	public void selfIntroduction(String name, char gender, int age) {
		System.out.println("我叫:" + name + ",性别:" + gender + ",年龄:" + age);
	}

	public void eat() {
		System.out.println("人吃饭");
	}

	public static void main(String[] args) {
		Person person = new Person("张三");
		person.selfIntroduction("张三", '男', 20);
	}
}


자동차 클래스 작성:

속성: 브랜드, 자동차 길이, 색상, 가격,

"Jetta", "BMW", "Rolls Royce", "Cruze", "Malibu"의 5개 객체 생성

매개변수가 없는 생성자와 매개변수화된 생성자를 제공합니다.

public class Car {
	private String brand;
	private int length;
	private String color;
	private int price;

	public Car() {
		super();
	}

	public Car(String brand) {
		super();
		this.brand = brand;
	}

	public static void main(String[] args) {
		Car car1 = new Car("捷达");
		Car car2 = new Car("宝马");
		Car car3 = new Car("劳斯莱斯");
		Car car4 = new Car("科鲁兹");
		Car car5 = new Car("迈锐宝");
	}
}


다음 프로그램을 실행한 결과는 다음과 같습니다.

public class Test1 {

	public static void main(String[] args) {
		new A(new B());
	}
}

class A {
	public A() {
		System.out.println("A");
	}

	public A(B b) {
		this();
		System.out.println("AB");
	}
}

class B {
	public B() {
		System.out.println("B");
	}
}

답변:

AB


매개변수 전달 정보

연습 하나

결과 쓰기

public class Test {
	public static void leftshift(int i, int j) {
		i += j;
	}

	public static void main(String args[]) {
		int i = 4, j = 2;
		leftshift(i, j);
		System.out.println(i);
	}
}

답변: 4 

그것은 leftShift 기능과 아무 관련이 없습니다.


운동 2

결과 쓰기

public class Demo {
	public static void main(String[] args) {
		int[] a = new int[1];
		modify(a);
		System.out.println(a[0]); //
	}

	public static void modify(int[] a) {
		a[0]++;
	}
}

답변: 1


연습 3

public class TestA {
	int i;

	void change(int i) {
		i++;
		System.out.println(i);
	}

	void change1(TestA t) {
		t.i++;
		System.out.println(t.i);
	}

	public static void main(String[] args) {
		TestA ta = new TestA();
		System.out.println(ta.i); //0
		ta.change(ta.i);//1
		System.out.println(ta.i); //0
		ta.change1(ta); //1
		System.out.println(ta.i);//1
	}
}


연습 4

class Value {
	int i = 15;
}

class Test {
	public static void main(String argv[]) {
		Test t = new Test();
		t.first();
	}

	public void first() {
		int i = 5;
		Value v = new Value();
		v.i = 25;
		second(v, i);
		System.out.println(v.i);
	}

	public void second(Value v, int i) {
		i = 0;
		v.i = 20;
		Value val = new Value();
		v = val;
		System.out.print(v.i + " " + i);
	}
}

A.15 0 20

B.15 0 15

C.20 0 20

D.0 15 20

·답변: A


다섯 번째 연습

다음 코드를 실행한 결과는?

public static void main(String[] args) {
	int i = 0;
	change(i);
	i = i++;
	System.out.println("i = " + i);
}
public static void change(int i){
	i++;
}

답: i = 0


public static void main(String[] args) {
	String str = new String("world");
	char[] ch = new char[]{'h','e','l','l','o'};
	change(str,ch);
	System.out.println(str);
	System.out.println(String.valueOf(ch));
}
public static void change(String str, char[] arr){
	str = "change";
	arr[0] = 'a';
	arr[1] = 'b';
	arr[2] = 'c';
	arr[3] = 'd';
	arr[4] = 'e';
}

답변:

세계

에이 비 씨 디이


public class Test {
	int a;
	int b;

	public void f() {
		a = 0;
		b = 0;
		int[] c = { 0 };
		g(b, c);
		System.out.println(a + " " + b + " " + c[0]);
	}

	public void g(int b, int[] c) {
		a = 1;
		b = 1;
		c[0] = 1;
	}

	public static void main(String[] args) {
		Test t = new Test();
		t.f();
	}
}

답: 1 0 1


짧은 답변

메서드에 객체를 매개변수로 전달하면 메서드는 객체의 속성을 변경하고 변경된 결과를 반환할 수 있으므로 값 전달입니까 아니면 참조 전달입니까?

답변: 값으로 전달합니다. Java 프로그래밍 언어에는 값별 매개변수만 있습니다. 개체 인스턴스가 매개 변수로 메서드에 전달되면 매개 변수 값은 개체에 대한 참조입니다. 객체의 내용은 호출된 메서드에서 변경할 수 있지만 객체의 참조는 절대 변경되지 않습니다.


발문


나는 기사를 계속 업데이트 할 것입니다! 다들 3번 클릭해주시길 바라며 , 여러분의 격려가 작가가 계속 업데이트할 수 있는 원동력이 됩니다.

추천

출처blog.csdn.net/qq_34025246/article/details/126913962