java300集基礎學習--尚學堂(28~51面向對象)
課時28:面向過程和面向對象的本質區別
本章概述
面向對象概念
oriented 確定…的方位 面向
object 對象
面向對象:通過對象來組織代碼,通過對象來封裝我們的數據
面向對象與面向過程之間的關系
面向對象編程起源
類似于c語言中的結構體
c++ 把同屬性的變量 同屬性的函數組合在一起為一個整體的類
面向對象編程優點
擴展性強、分工強、適合夠復雜的軟件
課程29:面向對象的方式思考問題
面向對象編程初步
- 如何開汽車(事物比較簡單,可以用線性的思維去解決)
面向過程: 面向對象:
1.踩離合 駕駛員
2.掛擋 汽車
3.踩油門,放離合 駕駛員開汽車!
4.開了 car.start(); -
如何造汽車(事情比較復雜,使用簡單的線性思維無法解決)
課程30:類和對象的關系 寫出我們的第一個類
對象和類的概念
- 面向的對象編程(OOP)的本質:以類的方式組織代碼,以對象的方式封裝(組織)數據
- 對象:是具體的事物
- 類:是對對象的抽象(抽象 抽出象的部分)
- 先有具體的對象,然后抽象各個對象之間象的部分,歸納出類,通過類再認識其他對象
- 對象和類的關系:特殊到一般,具體到抽象
- 類:我們叫class
- 對象:我們叫做Object,instance(實例)。以后我們說某個類的對象,某個類的實例。是一個意思
- 類可以看成一類對象的模板,對象可以看成該類的一個具體實例
- 類是用于描述同一類形的對象的一個抽象的概念,類中定義了這一類對象所應具有的靜態和動態屬性
- 對象是java程序的核心,在java程序中“萬事萬物皆對象”
- JDK提供了很多類供編程人員使用,編程人員也可以定義自己的類
package com.syy;
public class Student {
//靜態的數據
String name;
int id;
int age;
String gender;
//動態的行為
public void study(){
System.out.println(name+"在學習");
}
public void sayhello(String sname){
System.out.println(name+"想"+sname+"說你好");
}
public static void main(String[] agrs){
Student s1 = new Student();
s1.name = "王哄";
s1.study();
s1.sayhello("王小二");
}
}
/*
* s1: name王哄
* age
* id
* gender
* weight
* study()
* syahello
*/
課時31 程序執行過程的內存分析01
引用類型
- java語言中除基本類型之外的變量類型都稱之為引用類型
- java中的對象是通過引用(reference)對其操作的
類的屬性
- 屬性 field, 或者叫成員變量
- 成員變量系統會初始化,局部變量系統不會初始化
- 屬性用于定義該類或該類對象包含的數據或者說靜態屬性
- 屬性作用范圍是整個類體
- 在定義成員變量時可以對其初始化,如果不對其初始化,java使用默認的值對其初始化。數值:0,0.0, boolean:false 所有引用類型:null
- 屬性定義格式
[修飾符] 屬性類型 屬性名 = [默認值]
修飾符:可以省略,可以是:public protected static final
屬性類型:可以是任意類型,基本類型和引用類型
屬性名:合法標識符都可 首字母小寫 駝峰原則
類的方法
- 面向對象中,整個程序的基本單位是類,方法是從屬于類的
- java中方法參數傳遞是:值傳遞
- 方法定義格式
[修飾符] 方法返回值類型 方法名(形參列表){
//n條語句
}
內存分析
- 棧 存放:局部變量
- 堆 存放:new出來的對象
- 方法區 存放:類的信息(代碼)、static變量、常量池(字符串常量)等
內存分析實例
package com.syy;
public class Student {
//靜態的數據
String name;
int id;
int age;
String gender;
//動態的行為
public void study(){
System.out.println(name+"在學習");
}
public void sayhello(String sname){
System.out.println(name+"想"+sname+"說你好");
}
public static void main(String[] agrs){
//通過類加載器Class Loader加載Student類。加載后,在方法區中就有了Student類的信息;
Student s1 = new Student();
s1.name = "王哄";
s1.study();
s1.sayhello("王小二");
}
}
/*
* s1: name王哄
* age
* id
* gender
* weight
* study()
* syahello
*/
課程32程序執行過程的內存分析02
課程33虛擬機內存管理 垃圾回收機制 c++和java的比較
垃圾回收機制(Garbage Collection)
- 對象空間的分配:
使用new關鍵字創建對象即可 - 對象空間的釋放:
將對象賦值null即可垃圾回收器將負責回收所有“不可達”對象的北村空間 - 要點:
程序員無權調用垃圾回收器
程序員可以通過System.gc()。通知GC運行,但是JAVA規范并不能保證立刻運行
finalize方法,是JAVA提供給程序員用來釋放對象或資源的方法,但是盡量少用 - C++垃圾回收機制需要自己調用
課程34 構造方法
構造器
- 構造器又稱為構造方法,constructor
- 構造器用于構造該類的實例
- 格式如下:
[修飾符] 類名(形參列表){
//n條語句
}
- 是一種特殊的方法:
1.通過new關鍵字調用
2.構造器雖然有返回值,但是不能定義返回類型(返回值的類型肯定是本類),不能再構造器里調用return
3.如果我們沒有定義構造器,則系統會自動定義一個無參的構造函數。如果已定義則編譯器不會添加
4.構造器的方法名必須與類名一致
5.作用:構造該類的對象,經常也用來初始化對象的屬性
package com.syy;
public class Car34 {
int speed;
public Car34(){
System.out.println("構造一輛車");
}
}
package com.syy;
/**
* 測試構造方法
* @author Administrator
*
*/
public class Constructor {
public static void main(String[] args){
Car34 c = new Car34();
}
}
實例
- 定義一個點(point)類用來表示三維空間中的點(有三個坐標)。要求如下:
可以生成具有特定坐標的點對象
提供可以設置三個坐標的方法 - 提供可以計算該點距另外點距離平方的方法
- 代碼:
package com.syy;
public class Point {
double x,y,z;
//通過構造器初始化對象的屬性
public Point(double _x,double _y, double _z){
x = _x;
y = _y;
z = _z;
}
public void setX(double _x){
x =_x;
}
public void setY(double _y){
x =_y;
}
public void setZ(double _z){
x =_z;
}
public double distance(Point p){
double result = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z));
return result;
}
public static void main(String[] agrs){
Point p = new Point(3,4,8);
Point p2 = new Point(30,40,80);
p.setX(10);
System.out.println(p.x);
System.out.println(p.distance(p2));
}
}
課程35:方法重載_構造方法重載
重載(overload)
- 方法的重載是指一個類中可以定義有相同得名字,但參數不同的多個方法。調用時,會根據不同的參數表選擇對應的方法。
- 兩同三不同
同一個類,同一個方法名
不同:參數列表不同(類型 個數 順序不同) - 只有返回值不同不構成方法的重載
int a(String str){},
void a{String i}
調用: a();
誰能告訴我調用的哪一個方法
- 只有形參的名稱不同,不構成方法的重載
- 與普通方法一樣,構造方法也可以重載
package com.syy;
/**
* 測試方法重載
* @author Administrator
*
*/
public class Overload {
public static void main(String[] agrs) {
myMath m = new myMath();
int result = m.add(4.2, 5);
System.out.println(result);
}
}
class myMath{
/*
int a;
int b;
public myMath(int a){
this.a = a;
}
public myMath(int a, int b){
this.a = a;
this.b = b;
}
*/
public int add(int a,int b){
return a+b;
}
public int add(int a,double b){
return (int)(a+b);
}
public int add(double a,int b){
return (int)(a+b);
}
public int add(int a, int b,int c){
return a+b+c;
}
}
課時36:static變量和方法 內存分析static
static關鍵詞
- 在類中,用static聲明的成員變量為靜態變量,或者叫做:類屬性、類變量
1.它為該類的公用變量,屬于類,被該類的所有實例共享,在類被載入時被顯示初始化
2.對于該類的所有對象來說,static成員變量只有一份。被該類的所有對象共享
3.可以使用“對象.類屬性”來調用。不過,一般都是用“類名.類屬性”
4.static變量置于方法區中 - 用static聲明的方法為靜態方法
1.不需要對象,就可以調用(類名.方法名)
2.在調用該方法時,不會將對象的引用傳遞給它,所以在static方法中不可訪問非static得成員
package com.syy;
public class Student2 {
String name;
int id;
static int ss;
public static void printSS(){
System.out.println(ss);
}
}
package com.syy;
public class Test {
public static void main(String[] agrs){
Student2.ss = 323;
Student2.printSS();
}
}