Java---第5章
クラスとオブジェクト
クラスの起源:
日常生活において、人は同じ特性や行動を持つものを 1 つのカテゴリに分類することがよくあります。
Java では、このようなことを記述するために Java クラスが使用されます。これが Java クラスの誕生です。Java はクラスを組織単位とする言語です。ここで
定義する Java クラスは、参照データに属する Java データ型です。タイプ。
クラスを定義する方法:
public class 类名{
}
例:
人物を定義する
人間に共通する特徴を見つけます。
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
}
人間の一般的な動作を調べます。Java
で動作を記述するにはメソッドを使用します。メソッドの定義構文は次のとおりです。
//[]中内容表示可有可无
访问修饰符 返回值类型 方法名([参数列表]){
[return 返回值;]
}
例:
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void work(){
System.out.println("工作");
}
}
ケース 1: 2 つの数値に対して
加算、減算、乗算、および除算の分析を実行できる計算機を定義します。
- 電卓は 2 つの数値と演算子を受け入れることができます
- 電卓で計算できる
public class Caculator{
public double number1;//接收数字1
public double number2;//接收数字2
public String operator;//接收运算符
public void caculator(){
//计算
switch (operator){
case "+":
System.out.println(number1 + number2);
break;
case "-":
System.out.println(number1 - number2);
break;
case "*":
System.out.println(number1 * number2);
break;
case "/":
System.out.println(number1 / number2);
break;
}
}
}
クラス図:
クラス図はクラスの構造を記述しており、フローチャートと同じくらいシンプルで直感的です。
- パブリックに変更されたプロパティとメソッドの前に「 +」を使用します
- プライベートに変更されたプロパティとメソッドの前に「 -」を使用します
二人の関係
クラスは、複数のものの共通の特性と動作を記述する抽象本体です。オブジェクトは
特定のトランザクションであり、各属性と動作は具体的な
クラスです。オブジェクトのコレクションであり、クラスは特定のオブジェクトを構築するために使用されます。 。
文法:
类名 对象名 = new 类名();
对象名.属性名 = 属性值;
public class study {
public static void main(String[] args) {
//这里p称为对象名,和数组名一样,本质都是变量
Person p = new Person();//构建了一个具体的人
p.name = "汴京城下君";
p.sex = "男";
p.age = 20;
}
}
メンバー変数:
でクラスで定義された変数はメンバー変数です。
メンバー変数の初期値:
タイプ | 初期値 |
---|---|
参照データ型 | ヌル |
整数 | 0 |
浮動小数点数 | 0.0 |
ブール値 | 間違い |
文字 | 「\u0000」 |
ローカル変数:
でメソッドの内部定義変数。初期値がないので使用前に初期化する必要があります
public void eat(){
String name;//报错,没有初始化
System.out.println(name+"吃饭");
}
ローカル変数がメンバー変数と同じ名前の場合、ローカル変数の優先順位が高くなります。
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
public void eat(){
String name="张三";
System.out.println(name+"吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void work(){
System.out.println("工作");
}
}
public class ob {
public static void main(String[] args) {
//这里p称为对象名,和数组名一样,本质都是变量
Person p = new Person();//构建了一个具体的人
p.name = "汴京城下君";
p.sex = "男";
p.age = 20;
p.eat();
}
}
出力:
Zhang San が食べる
このキーワード:
メソッド内で、ローカル変数とメンバ変数が同じ名前で、このときメンバ変数を使いたい場合はどうすればよいでしょうか?
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
public void eat(){
String name="张三";
System.out.println(this.name+"吃饭");
}
}
public class ob {
public static void main(String[] args) {
//这里p称为对象名,和数组名一样,本质都是变量
Person p = new Person();//构建了一个具体的人
p.name = "汴京城下君";
p.sex = "男";
p.age = 20;
p.eat();
}
}
出力:
Bianjing Cheng Xiajun が食べる
これはメンバー メソッドを呼び出すこともできます。
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
public void eat(){
String name="张三";
System.out.println(name+"吃饭");
sleep();
// 也相当于this.sleep();
}
public void sleep(){
System.out.println("睡觉");
work();
}
public void work(){
System.out.println("工作");
eat();
}
}
施工方法
これは主にオブジェクトを作成し、オブジェクトのプロパティ初期化操作を完了するために使用され、コンストラクターはオブジェクトから呼び出すことはできません。
文法:
//[]中内容可有可无
访问修饰符 类名([参数列表]){
}
例:
public class Person{
public String name;//姓名
public String sex;//性别
public int age;//年龄
public Person(){
this.name = "默认姓名";
this.sex = "默认性别:男";
this.age = 21;
}
public void eat(){
String name="hello";
System.out.println(age+"岁的"+sex+"性"+this.name+"吃饭");
}
}
public class ob {
public static void main(String[] args) {
//这里p称为对象名,和数组名一样,本质都是变量
Person p = new Person();//构建了一个具体的人
p.eat();
p.name = "汴京城下君";
p.sex = "男";
p.age = 20;
p.eat();
}
}
出力:
21歳のデフォルトの性別:男性のデフォルト名を食べる
20歳の男性、辺京チェン・シアジュンを食べる
パラメーターを使用した 2 つのメソッド
コンストラクターはパラメーターを受け取ります。
次のコードを観察してください。どこが間違っているのでしょうか?
既存のコンピューター クラスは次のように定義されます。
public class Computer{
public String brand;//品牌
public String type;//型号
public int price;//价格
}
次に、次のように 3 つの特定のコンピューター インスタンスを作成します。
public class ComputerTest{
public static void main(String[] args){
Computer c1 = new Computer();
c1.brand = "联想";
c1.type = "w1";
c1.price = 5500;
Computer c2 = new Computer();
c2.brand = "联想";
c2.type = "w2";
c2.price = 6500;
Computer c3 = new Computer();
c3.brand = "联想";
c3.type = "w3";
c3.price = 7500;
}
}
問題を分析します:
オブジェクトが作成されるたびに、オブジェクト属性の割り当てが繰り返されるため、多くの冗長なコードが生成されますが、
パラメータ化された構築方法を使用して最適化できます。
パラメーターを含むコンストラクター構文: /font>
访问修饰符 类名(数据类型1 变量1,数据类型2 变量2,.....数据类型n 变量n){
}
最適化:
パラメータ付きのコンストラクタ
public class Computer{
public String brand;//品牌
public String type;//型号
public int price;//价格
public Computer(){
}
//如果在一个类中已经定义了带参数的构造方法,此时还想用无参构造方法,
//那必须将无参构造方法也定义出来
public Computer(String brand,String type,int price){
//此时在类中定义了带参数的构造方法,那么编译器不会为这个类添加默认的无参构造方法
}
}
新しいオブジェクトを構築する
public class ComputerTest{
public static void main(String[] args){
Computer c1 = new Computer("联想","w1",5500);
Computer c2 = new Computer("联想","w2",6500);
Computer c3 = new Computer("联想","w3",7500);
}
}
ケース 1:
書籍クラス (名前、出版社、出版年、価格) を定義し、パラメーター化されたコンストラクターを使用してオブジェクトを作成する
public class Book{
public String name;//书名
public String publisher;//出版社
public String publishtime;//出版时间
public double price;//价格
public Book(){
}
public Book(String name,String publisher,String publishtime, double price){
}
}
public class BookTest{
public static void main(String[] args){
Book b1 = new Book("活着","北京十月文艺出版社","2017-06-01",32.5);
Book b2 = new Book("动物农场","上海译文出版社","2010-08-01",28.4);
Book b3 = new Book("瓦尔登湖","北京十月文艺出版社","2019-01-01",25.8);
Book b4 = new Book("你当像鸟飞往你的山","南海出版公司","2019-11-01",34.2);
}
}
パラメータ付きメソッド
パラメーター構文を使用したメソッド:
访问修饰符 返回值类型 方法名(数据类型1 变量名1,...数据类型n 变量名n{
[return 返回值;]
}
//带参方法调用
对象名.方法名(实参1,实参2,...实参n);
ケース 1:
電卓
public class Calculator{
public int number1;
public int number2;
public String operator;
public int calculator(){
//如果在一个方法中返回值类型不是void,那么在选择结构中,
//必须每种情况都提供一个返回值
switch (operator) {
case "+": return number1 + number2;
case "-": return number1 - number2;
case "*": return number1 * number2;
case "/": return number1 / number2;
default:return 0;
}
}
}
ケース 2:
商人は合計 30 個のビールを持っていて、1 個の価格は 72 元でした。商人は 30 個を 3 日以内に完売しました。毎日いくら買いましたか? (上記の計算機を使用してください)
public class CalculatorTest{
public static void main(String[] args){
Calculator c = new Calculator();
c.number1 = 30;
c.number2 = 72;
c.operator = "*";
int total = c.calculator();
c.number1 = total;
c.number2 = 3;
c.operator = "/";
int avg = c.calculator();
System.out.println("每天买了"+avg);
}
}
どうしたの?
冗長なコードがまだたくさんあります
コードを最適化するためにパラメーターを使用した構築方法を使用することもできますが、これは日常生活とは一致しません。
ここでは 2 つの計算機を作成しましたが、日常生活で必要なのは 1 つだけです。
パラメータを指定したメソッドを使用して最適化します。
public class Calculator{
public int calculator(int number1,int number2,String operator){
switch (operator) {
case "+": return number1 + number2;
case "-": return number1 - number2;
case "*": return number1 * number2;
case "/": return number1 / number2;
default:return 0;
}
}
}
public class CalculatorTest{
public static void main(String[] args){
Calculator c = new Calculator();
int total = c.calculator(30,72,"*");
int avg = c.calculator(total,3,"/");
System.out.println("每天买了"+avg);
}
}
ケース 3:
各数値の階乗を求める
public int factorial(int number){
if(number==0) {
return 1;
}
int result = 1;
for(int i=1;i<=number;i++){
result = result * i;
}
return result;
}
ケース 4:
メソッドを使用して数値が素数かどうかを判断する
public class Number{
public boolean isPrime(int number){
if(number==2) return true;
for(int i=2;i*i<number;i++){
if(number%i==0){
return false;
}
}
return true;
}
}
public class NumberTest{
public static void main(String[] args){
Number tal = new Number();
boolean result = tal.isPrime(5);
System.out.println(result);
}
}
オブジェクトの配列
たとえば、生徒の情報を保存するには:
public class Student{
public String name;
public int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
public class StudentTest{
public static void main(String[] args){
Student[] students = new Student[2];
students[0] = new Student("张三",21);
students[1] = new Student("李四",22);
}
}
ケース 1:
配列を使用して、学生が選択した 5 つの必須コース (コース番号、コース名、単位) を保存します。
public class Coures{
public int code;
public String name;
public double scores;
public Coures(int code,String name,double scores){
this.code = code;
this.name = name;
this.scores = scores;
}
}
public class CouresTest{
public static void main(String[] args){
Coures[] lessons = new Coures[5];
lessons[0] = new Coures(31,"数据结构与算法",2);
lessons[1] = new Coures(1,"Java",1.5);
lessons[2] = new Coures(2,"C++",1.3);
lessons[3] = new Coures(12,"Python",2.1);
lessons[4] = new Coures(18,"MySQL",1.9);
}
}
メソッドパラメータとしてデータ型を参照する
事例:
携帯電話専門店には携帯電話の陳列棚が 100 台あり、販売員は携帯電話を 1 台ずつ陳列ラックに並べています。このプロセスを説明するには、オブジェクト指向の設計思考を使用してください。(携帯電話にはブランド、モデル、価格があります)
分析します:
- このプロセスには 2 つのオブジェクトが関係しており、1 つは携帯電話、もう 1 つは販売員であるため、これら 2 つのオブジェクトのクラスを構築する必要があります。
- 携帯電話を置くのは販売員の行為なので方法が必要
- 100 台の携帯電話ディスプレイ ラックはすべて携帯電話を展示するためのものであるため、オブジェクト アレイ ストレージを使用する必要があります
コード:
public class Mobile {
public String brand;
public String type;
public double price;
public Mobile(String brand,String type,double price){
this.brand = brand;
this.type = type;
this.price = price;
}
}
public class Saler {
public Mobile[] mobiles = new Mobile[100];
public void playmobies(Mobile mobile){
for(int i=0;i<mobiles.length;i++){
if(mobiles[i]==null){
mobiles[i] = mobile;
break;
}
}
}
}
public class MobileTest{
public static void main(String[] args){
Saler saler = new Saler();
//调用售货员放手机
saler.playmobies(new Mobile("小米","小米13",3499));
}
}
ケース 1:
既存の 3 つのクラス A、B、および C の結果は次のとおりです。
- A:80、72、85、67、50、76、95、49
- B:77、90、92、89、67、94
- C:99、87、95、93、88、78、85
各クラスの成績を高いものから低いものまで並べ替えることが必要になりました
import java.util.Arrays;
public class TeacherTest{
public static void main(String[] args){
int[] arr1 = {
80,72,85,67,50,76,95,49};
int[] arr2 = {
77,90,92,89,67,94};
int[] arr3 = {
99,87,95,93,88,78,85};
sortDesc(arr1);
System.out.println(Arrays.toString(arr1));
sortDesc(arr2);
System.out.println(Arrays.toString(arr2));
sortDesc(arr3);
System.out.println(Arrays.toString(arr3));
}
public static void sortDesc(int[] arr){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j] < arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
基本データ型が値によって渡される場合、渡されるのは値のコピーです
public class PassingValue{
public static void main(String[] args){
int a = 10;
change(a);
System.out.println(a);
}
public static void change(int number){
number++;
}
}
出力:
10
参照データ型で値を渡す場合、渡されるのはヒープ メモリ上のオブジェクトの空間アドレスです。
メソッドのオーバーロード
同じクラス内で、同じメソッド名と異なるパラメータ リストを持つ複数のメソッドがメソッドのオーバーロードを構成します。
例:
public class Returnd{
public int sum(int x,int y){
return x+y;
}
public int sum(int x,int y,int c){
return x+y+c;
}
}
間違い:
public class Teacher{
public int sum(){
return 1;
}
public void sum(){
System.out.println("1");
}
}
メソッド名とパラメータリストが同じであるため、メソッドのオーバーロードではありません。
同じクラス内でそのようなメソッド定義を持つことは不可能です
オブジェクト指向の説明
例:
シンプルな学生管理システム
- このプロセスには、ユーザーとメニューという 2 つのオブジェクト (トランザクション) が関係します。
- ユーザーは結果を追加、削除、変更、確認するアクションを持ちます。
オブジェクト指向と手続き型指向の違い
- オブジェクト指向焦点はオブジェクトにあり、プロセスの組み立てを完了するにはオブジェクトの動作を使用する必要があります。
- プロセス指向焦点はプロセスの実現にあります