七、 面向對象(二)

  匿名類對象

  創建的類的對象是匿名的。當我們只需要一次調用類的對象時,我們就可以考慮使用匿名的方式創建類的對象。特點是創建的匿名類的對象只能夠調用一次!

package day007;//圓的面積
class circle {double radius;public double getArea() {// TODO Auto-generated method stubreturn Math.PI * radius * radius;}public void setRadius(double r){radius = r;}public double getRadius(){return radius;}public void show(){System.out.println("我是一個圓");}}public class lambda{public void printArea(circle c, int time){System.out.println("radius"+"\t"+"area");for(int i =1;i<= time;i++){c.setRadius(i);System.out.println(c.getRadius() + "\t" + c.getArea());}}public static void main(String[] args){lambda p = new lambda();circle c = new circle();//新的圓半徑為0p.printArea(c, 5);new circle().show();//這個對象就是匿名對象,只使用一次后就無法再次調用
    }
}
對象作為參數傳遞

  在上面這個例子里,我們使用new circle()直接調用circle的方法。這個對象就是匿名類對象,這個對象產生時,在內存堆中開辟內存存儲了數據,但是在棧中并沒有相應的變量名指向這塊內存地址,那么我們無法再第二次調用這個匿名類,即我們不可以使用此類再次調用circle類的屬性與方法。

  在java虛擬機中,這個匿名類對象很快就被垃圾回收機制收走了,切記,當我們某個類對象只需要使用一次的情況,我們才會考慮使用匿名類對象。

  可變個數的行參的方法:

  格式:對于方法的形參: 數據類型 ... 形參名;

  可變個數的形參的方法與同名的方法之間構成重載;

  可變個數的形參在調用時,個數從0開始,到無窮多個都可以。

  使用可變多個形參的方法與方法的形參使用數組是一致的。

  若方法中存在可變個數的形參,那么一定要聲明在方法形參的最后。

  在一個方法中,最多聲明一個可變個數的形參。

package day007;public class javaArgs {public static void main(String[] args) {// TODO Auto-generated method stubjavaArgs jargs = new javaArgs();jargs.getSum(1,2,3,4);new javaArgs().getSum(123,223);jargs.getSum("求和是", 2,3,5,8);}
//    public int getSum(int ... args){public void getSum(int ... args){int sum = 0;//args使用與數組一致for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(sum);
//        return sum;
        }//重載,可變個數的形參聲明在方法形參的最后public void getSum(String s,int ... args){int sum = 0;for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(s + ":"+ sum);}
}
java的*args的使用

?  java中形參與實參

  形參:方法聲明時,方法小括號內的參數,實參:調用方法時,實際傳入的參數的值。

  我們之前做的兩個值轉換:

package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//兩個值轉換int i = 10;int j = 5;System.out.println("i:" + i + " j:" + j);int temp = i;i = j;j = temp;System.out.println("i:" + i + " j:" + j);}}
兩個值交換

  然后你可能會想用一個類封裝一個方法完成交換。然后你寫了這樣一個方法。

package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//兩個值轉換int i = 10;int j = 5;//封裝到類方法TestArgsTransfer tt = new TestArgsTransfer();System.out.println("i:" + i + " j:" + j);tt.swap(i, j);//將i的值傳遞給m,j的值傳遞給nSystem.out.println("i:" + i + " j:" + j);}//定義一個方法,交換兩個變量的值public void swap(int m,int n){int temp = m;m = n;n = temp;System.out.println("m:" + m + " n:" + n);}}
你寫的封裝方法

  結果是你的i和j根本就沒有變,為什么呢?

  簡單來說就是i與j是你定義的類屬性,你將i,j作為實參傳到了類方法里面,類方法swap里的兩個變量發生了位置轉換,但是main中的兩個值并沒有發生任何變化,在內存中的表現如上圖,調用swap方法時,會在棧中存兩個swap的局部變量,這兩個變量的值交換了,但是main的變量未發生改變。

  那我們要如何做呢。

package day007;public class TestArgsTransfer1 {public static void main(String[] args) {// TODO Auto-generated method stubTestArgsTransfer1 tt = new TestArgsTransfer1();DataSwap ds = new DataSwap();System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);tt.swap(ds);System.out.println(ds);System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);}//交換元素的值public void swap(DataSwap d){int temp = d.i;d.i = d.j;d.j = temp;System.out.println(d);//打印引用變量d的值
    }
}class DataSwap{int i = 10;int j = 5;
}
形參是引用數據類型

  這里swap方法傳入的是一個引用數據類型ds,相當于d與ds一致都指向同一個堆空間,那么在swap中完成兩個值的交換。

  練習一下,下面代碼的執行結果是什么:

class Value {int i = 15;
}class TestValue {public static void main(String argv[]) {TestValue t = new TestValue();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.println(v.i + " " + i);}
}

  分析:

  第一步,定義了TestValue類,在類的main函數中,生成一個實例t,并在堆中開辟內存(0x0001),在棧中定義t指向堆中內存0x0001。實例調用實例的first方法。

  第二步,在棧中有局部變量i值為5,一個新的變量v,指向堆中新開辟內存(0x0011),v的局部變量i值為25,將v與當前局部變量i=5作為實參傳給second方法。

  第三步,局部變量i的值改為0,v的局部變量i變為20,定義一個新變量val指向堆中先開辟內存(0x0111),second中實參v指向內存(0x0111)

  第四步,此時打印v.i值為內存0x0111中的i,值為15,i為局部空間中的變量i為0,first打印的v.i值為20(實參傳入first,v本身未發生指向的改變)。

  面向對象:封裝

  我們考慮不讓對象來直接作用屬性,而是通過"對象.方法"的形式,來控制對象對屬性的訪問。實際情況中,對屬性的要求就可以通過方法來體現。

  兩種方法:①將類的屬性私有化,②提供公共的方法(setter & getter)來實現調用。

package day007;public class java_private {public static void main(String[] args) {// TODO Auto-generated method stubAnimal an = new Animal();
//        an.legs = 4;//飄紅an.setLegs(4);an.getLegs();}}class Animal{private String name;private int legs;public void setLegs(int l){legs = l;}public int getLegs(){System.out.println(legs);return legs;}
}
私有封裝

  權限修飾符

?  構造器

  也就是構造方法,但是與python的__init__有相似之處,但是不完全一致。

  構造器的作用:①創建對象 ②給創建的對象的屬性賦值(創建對象的話,相當于python中的__new__與__init__的作用)。

  1.設計類時,若不顯式聲明類的構造器的話,程序會默認提供一個空參的構造器

  默認加()就相當于調用了構造器了,類比python加()后實例化即調用了構造方法。

  2.一旦顯式的定義類的構造器,那么默認的構造器就不再提供。

  3.如何聲明類的構造器。格式:權限修飾符? 類名(形參){ }。

  ?4.類的多個構造器之間構成重載。

  類對象的屬性賦值的先后順序:①屬性的默認初始化 ②屬性的顯式初始化③通過構造器給屬性初始化?④通過"對象.方法"的方式給屬性賦值。

package day007;public class init {public static void main(String[] args) {Person p1 = new Person();System.out.println(p1.getName() + ":" + p1.getAge());String str = new String("hello");System.out.println(str);Person p2 = new Person("jeff");System.out.println(p2.getName());System.out.println(p2.getAge());Person p3 = new Person("frank",23);System.out.println("name:" + p3.getName() + " age:" + p3.getAge());//體會屬性賦值的過程Person p4 = new Person();System.out.println("name:" + p4.getName() + " age:" + p4.getAge());Person p5 = new Person(12);System.out.println("name:" + p5.getName() + " age:" + p5.getAge());}
}class Person{//屬性private String name;private int age = 1;//構造器public Person(String n){name = n;}public Person(){
//        age = 10;
//        name = "張三";
    }public Person(int a){age = a;}public Person(String n,int a){name = n;age = a;}//方法public void setName(String n){name = n;}public void setAge(int a){age = a;}public String getName(){return name;}public int getAge(){return age;}
}
構造器

  ?  

轉載于:https://www.cnblogs.com/Jeffding/p/8681442.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389934.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習 客戶流失_通過機器學習預測流失

機器學習 客戶流失介紹 (Introduction) This article is part of a project for Udacity “Become a Data Scientist Nano Degree”. The Jupyter Notebook with the code for this project can be downloaded from GitHub.本文是Udacity“成為數據科學家納米學位”項目的一部分…

2044. 統計按位或能得到最大值的子集數目

2044. 統計按位或能得到最大值的子集數目 給你一個整數數組 nums &#xff0c;請你找出 nums 子集 按位或 可能得到的 最大值 &#xff0c;并返回按位或能得到最大值的 不同非空子集的數目 。 如果數組 a 可以由數組 b 刪除一些元素&#xff08;或不刪除&#xff09;得到&…

redis系列:分布式鎖

1 介紹 這篇博文講介紹如何一步步構建一個基于Redis的分布式鎖。會從最原始的版本開始&#xff0c;然后根據問題進行調整&#xff0c;最后完成一個較為合理的分布式鎖。 本篇文章會將分布式鎖的實現分為兩部分&#xff0c;一個是單機環境&#xff0c;另一個是集群環境下的Redis…

Qt中的坐標系統

轉載&#xff1a;原野追逐 Qt使用統一的坐標系統來定位窗口部件的位置和大小。 以屏幕的左上角為原點即(0, 0)點&#xff0c;從左向右為x軸正向&#xff0c;從上向下為y軸正向&#xff0c;這整個屏幕的坐標系統就用來定位頂層窗口&#xff1b; 此外&#xff0c;窗口內部也有自己…

預測股票價格 模型_建立有馬模型來預測股票價格

預測股票價格 模型前言 (Preface) If you are reading this, it’s most likely because you love to solve puzzles. I’m a very competitive person by nature. The Mt. Everest of puzzles, in my opinion, is trying to find excess returns through active trading in th…

Python 模塊 timedatetime

time & datetime 模塊 在平常的代碼中&#xff0c;我們常常需要與時間打交道。在Python中&#xff0c;與時間處理有關的模塊就包括&#xff1a;time&#xff0c;datetime,calendar(很少用&#xff0c;不講)&#xff0c;下面分別來介紹。 在開始之前&#xff0c;首先要說明幾…

大數模板Java

import java.util.*; import java.math.BigInteger; public class Main{public static void main(String args[]){Scanner cinnew Scanner(System.in);BigInteger a,b;acin.nextBigInteger();bcin.nextBigInteger();System.out.println(a.add(b));//加法System.out.println(a.…

檸檬工會_工會經營者

檸檬工會Hey guys! This week we’ll be going over some ways to work with result sets in MySQL. These result sets are the outputs of your everyday queries, such as:大家好&#xff01; 本周&#xff0c;我們將介紹一些在MySQL中處理結果集的方法。 這些結果集是您日常…

229. 求眾數 II

229. 求眾數 II 給定一個大小為 n 的整數數組&#xff0c;找出其中所有出現超過 ? n/3 ? 次的元素。 示例 1&#xff1a;輸入&#xff1a;[3,2,3] 輸出&#xff1a;[3]示例 2&#xff1a;輸入&#xff1a;nums [1] 輸出&#xff1a;[1]示例 3&#xff1a;輸入&#xff1a;…

寫給Java開發者看的JavaScript對象機制

幫助面向對象開發者理解關于JavaScript對象機制 本文是以一個熟悉OO語言的開發者視角&#xff0c;來解釋JavaScript中的對象。 對于不了解JavaScript 語言&#xff0c;尤其是習慣了OO語言的開發者來說&#xff0c;由于語法上些許的相似會讓人產生心理預期&#xff0c;JavaScrip…

Pythonic---------詳細講解

作者&#xff1a;半載流殤 鏈接&#xff1a;https://zhuanlan.zhihu.com/p/35219750 來源&#xff1a;知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。Pythonic&#xff0c;簡言之就是以Python這門語言獨特的方式寫出既簡潔又優美的代碼…

大數據ab 測試_在真實數據上進行AB測試應用程序

大數據ab 測試Hello Everyone!大家好&#xff01; I am back with another article about Data Science. In this article, I will write about what is A-B testing and how to use it on real life data-set to compare two advertisement methods.我回來了另一篇有關數據科…

492. 構造矩形

492. 構造矩形 作為一位web開發者&#xff0c; 懂得怎樣去規劃一個頁面的尺寸是很重要的。 現給定一個具體的矩形頁面面積&#xff0c;你的任務是設計一個長度為 L 和寬度為 W 且滿足以下要求的矩形的頁面。要求&#xff1a; 你設計的矩形頁面必須等于給定的目標面積。 寬度 …

node:爬蟲爬取網頁圖片

前言 周末自己在家閑著沒事&#xff0c;刷著微信&#xff0c;玩著手機&#xff0c;發現自己的微信頭像該換了&#xff0c;就去網上找了一下頭像&#xff0c;看著圖片&#xff0c;自己就想著作為一個碼農&#xff0c;可以把這些圖片都爬取下來做成一個微信小程序&#xff0c;說干…

如何更好的掌握一個知識點_如何成為一個更好的講故事的人3個關鍵點

如何更好的掌握一個知識點You’re launching a digital transformation initiative in the middle of the ongoing pandemic. You are pretty excited about this big-ticket investment, which has the potential to solve remote-work challenges that your organization fac…

centos 搭建jenkins+git+maven

gitmavenjenkins持續集成搭建發布人:[李源] 2017-12-08 04:33:37 一、搭建說明 系統&#xff1a;centos 6.5 jdk&#xff1a;1.8.0_144 jenkins&#xff1a;jenkins-2.93-1.1 git&#xff1a;git-2.9.0 maven&#xff1a;Maven 3.3.9 二、部署 2.1、jdk安裝 1&#xff09;下…

638. 大禮包

638. 大禮包 在 LeetCode 商店中&#xff0c; 有 n 件在售的物品。每件物品都有對應的價格。然而&#xff0c;也有一些大禮包&#xff0c;每個大禮包以優惠的價格捆綁銷售一組物品。 給你一個整數數組 price 表示物品價格&#xff0c;其中 price[i] 是第 i 件物品的價格。另有…

記錄一次spark連接mysql遇到的問題

在使用spark連接mysql的過程中報錯了&#xff0c;錯誤如下 08:51:32.495 [main] ERROR - Error loading factory org.apache.calcite.jdbc.CalciteJdbc41Factory java.lang.NoClassDefFoundError: org/apache/calcite/linq4j/QueryProviderat java.lang.ClassLoader.defineCla…

什么事數據科學_如果您想進入數據科學,則必須知道的7件事

什么事數據科學No way. No freaking way to enter data science any time soon…That is exactly what I thought a year back.沒門。 很快就不會出現進入數據科學的怪異方式 ……這正是我一年前的想法。 A little bit about my data science story: I am a complete beginner…

python基礎03——數據類型string

1. 字符串介紹 在python中&#xff0c;引號中加了引號的字符都被認為是字符串。 1 namejim 2 address"beijing" 3 msg My name is Jim, I am 22 years old! 那單引號、雙引號、多引號有什么區別呢&#xff1f; 1) 單雙引號木有任何區別&#xff0c;部分情況 需要考慮…