Java面向对象编程(基础部分)
生活随笔
收集整理的這篇文章主要介紹了
Java面向对象编程(基础部分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
面向對象編程(基礎部分)
類與對象
01:
public class ObjectWorkDemo {public static void main(String[] args){Cat cat1 = new Cat();cat1.name = "Tom";cat1.age = 3;cat1.color = "white";Cat cat2 = new Cat();cat2.name = "xiaohua";cat2.age = 100;cat2.color = "flower";} }class Cat {String name;int age;String color; }對象內存布局
屬性/成員變量
注意事項和細節說明
01:
public class PropertiesDetail {public static void main(String[] args){Person p1 = new Person();//p1 對象引用 Person() 才是真正的數據空間(真正的對象)} }class Person {int age;String name;double sal;boolean isPass; }創建對象
創建過程
小練習
成員方法
public class PersonWorkDemo {public static void main(String [] args){Person p1 = new Person();p1.speak();p1.cal01();p1.cal02(5);int res = p1.getSum(10,5);System.out.println(res);} }class Person{String name;int age;public void speak(){System.out.println("I am good person");}public void cal01(){int res = 0;for (int i = 1;i<=1000;i++){res+=i;}System.out.println(res);}public void cal02(int n){int res = 0;for (int i = 1;i<=n;i++){res+=i;}System.out.println(res);}public int getSum(int a,int b){return a+b;}}方法調用機制
成員方法的好處
-
提高代碼的復用性
-
可以將實現的細節封裝起來,然后供其他用戶來調用即可
成員方法的定義
注意事項和使用細節
小練習
01:
public class TestWork {public static void main(String [] args){AA a = new AA();boolean b = a.isOdd(1);if (b) System.out.println("yes");else System.out.println("no");} }class AA {public boolean isOdd(int num){if num%2!=0?true:false;}public void print(int row,int col,char c){for (int i = 0;i<row;i++){for (int j = 0;j<col;j++){System.out.print(c);}System.out.println();}} }成員方法傳參機制
- 基本數據類型,傳遞的是值(值拷貝),形參的任何改變不影響實參
01:
public class MethodParameter01 {public static void main(String[] args){int a = 10;int b = 20;AA object = new AA();object.swap(a,b);System.out.println("a = "+a+" b = "+b);//a = 10 b = 20} }class AA {public void swap(int a,int b){System.out.println("a = "+a+" b = "+b);//a = 10 b = 20int tmp = a;a = b;b = tmp;System.out.println("Later a = "+a+" b = "+b);//a = 20 b = 10} }- 引用類型傳遞的是地址(傳遞也是值,但是值是地址),可以通過形參影響實參
02:
public class MethodParameter02 {public static void main(String[] args){B b = new B(); int [] arr = {1,2,3};b.test100(arr);System.out.println("main:");for (int i = 0;i<arr.length;i++){System.out.print(arr[i]+"\t");//200 2 3}System.out.println();Person p = new Person();p.name = "Tom";p.age = 10;b.test200(p);System.out.println("main age = "+p.age);//1000} }class Person {String name;int age; }class B {public void test200(Person p){p.age = 1000;}public void test100(int [] arr){arr[0] = 200;for (int i = 0;i<arr.length;i++){System.out.print(arr[i]+"\t");//200 2 3}System.out.println();} }這里的"tom"p會被當做垃圾銷毀掉
小練習
public class TestDemo {public static void main(String[] args){Person p = new Person();p.name = "Jack";p.age = 30;MyTools myT = new MyTools();Person p2 = myT.copyPerson(p);System.out.println(p==p2);//false} }class Person {String name;int age; }class MyTools {public Person copyPerson (Person p){Person p2 = new Person();p2.name = p.name;p2.age = p.age;return p2;} }如果此時修改p2.name,并不會改變p.name,p2.name會指向一個新地址
方法遞歸調用
遞歸舉例
01:
public class Recursion01 {public static void main(String [] args){T t1 = new T();t1.test(4);} }class T {public void test(int n){if (n>2){test(n-1);}System.out.println("n = "+n);} }//n = 2 //n = 3 //n = 402:
public class Recursion01 {public static void main(String [] args){T t1 = new T();t1.test(4);} }class T {public void test(int n){if (n>2){test(n-1);}else{System.out.println("n = "+n);}} }//n = 203:
public class Recursion01 {public static void main(String [] args){T t1 = new T();int res = t1.factorial(5);System.out.println(res);//120} }class T {public int factorial(int n){if (n==1){return 1;}else{return factorial(n-1)*n;}} }遞歸重要規則
小練習
01:
class T {public int fab(int n){if (n>=1){if (n==1 || n==2){return 1;}else{return fab(n-1)+fab(n-2);}}else{System.out.println("Input Error");return -1;}} }02:
class T {public int peach(int day){if (day==10){return 1;}else if (day >= 1 && day <= 9){return (peach(day+1)+1)*2;}else{System.out.println("day在1-10");return -1;}} }老鼠出迷宮
03:
略!漢諾塔
八皇后
略!
方法重載
案例
01:
class MyCalculator {public int calculate(int n1,int n2){return n1+n2;}public double calculate(int n1,double n2){return n1+n2;}public double calculate(double n2,int n1){return n1+n2;}public int calculate(double n1,int n2,int n3){return n1+n2+n3;} }注意事項和使用細節
小練習
01:
01:
public class Test {public static void main(String[] args){Methods obj = new Methods();obj.m(8);obj.m(8,6);obj.m("dadas");} }class Methods {public void m(int n){System.out.println(n*n);}public void m(int n1,int n2){System.out.println(n1*n2);}public void m(String str){System.out.println(str);} }02:
public class Test {public static void main(String[] args){Methods obj = new Methods();} }class Methods {public int findMax(int n1,int n2){return n1>n2?n1:n2;}public double findMax(double n1,double n2){return n1>n2?n1:n2;}public double findMax(double n1,double n2,double n3){double max1 = n1>n2?n1:n2;double max2 = max1>n3?max1:n3;return max2;} }可變參數
案例
01:
public VariableParameter01 {public static void main(String[] args){HspMethod obj = new HspMethod;int res = obj.sum(1,5,100);System.out.println(res);//106} }class HspMethod {public int sum(int... nums){int sum =0 ;for (int i = 0;i<nums.length;i++){sum+=nums[i];}return sum;} }注意事項和使用細節
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5wXf9jxM-1634262458757)(C:\Users\Tom\AppData\Roaming\Typora\typora-user-images\image-20210912133042199.png)]
- 可變參數的實參可以為數組
01:
public class VariableParameterDetail {public static void(String[] args){int[] arr = {1,2,3};T t1 = new T();t1.f1(arr);} }class T {public void f1(int... nums){System.out.println(nums.length);//3} }- 可變參數可以和普通類型的參數一起放在形參列表,但必須保證可變參數在最后
01:
class T {public void f2(double str,double...nums){} }- 一個形參列表中只能出現一個可變參數
小練習
01:
public class HspMethod {public String showScore(String name,double... scores){double totalScore = 0;for (int i = 0;i<scores.length;i++){totalScore+=scores[i];}return name+scores.length+totalScore;} }作用域
注意事項和使用細節
- 屬性和局部變量可以重名,訪問時遵循就近原則
01:
public class ScopeDemo {public static void main(String[] args){} }class Person {String name = "Tom";public void say(){String name = "king";System.out.println("say() name = "+name);//say() name = king} }02:
public class ScopeDemo {public static void main(String[] args){} }class Person {String name = "Tom";public void say(){// String name = "king";System.out.println("say() name = "+name);//say() name = Tom} }- 在同一個作用域中,比如在同一個成員方法中,兩個局部變量,不能重名
01:
public class ScopeDemo {public static void main(String[] args){} }class Person {String address = "beijin";//String address = "guanzhou";//Error 重復定義String name = "hsp";}01:
public class ScopeDemo {public static void main(String[] args){Person p1 = new Person();p1.say();//當執行say()方法時,say方法的局部變量比如name會創建,當say執行完畢后,name局部變量銷毀,但是屬性(全局變量)仍然可以使用} }class Person {String name = "Tom";public void say(){String name = "king";System.out.println("say() name = "+name);} }- 作用域范圍不同
構造方法/構造器
- 案例
01:
public class Constructor01 {public static void main(String[] args){Person p1 = new Person("jack",80);System.out.println(p1.name+" "+p1.age);} }class Person {String name;int age;public Person(String pName,int pAge){name = pName;age = pAge;} }注意事項和使用細節
小練習
01:
public class Constructor01 {public static void main(String[] args){} }class Person {String name;int age;public Person(){age = 18;}public Person(String pName,int pAge){name = pName;age = pAge;} }對象創建的流程分析
javap
- P243
this關鍵字
01:
public class This01 {public static void main(String[] args){Dog dog1 = new Dog("大壯",3);dog1.info();} }class Dog {String name;int age;// public Dog(String dName,int dAge)// {// name = dName;// age = dAge;// }public Dog(String name,int age){this.name = name;this.age = age;}public void info(){System.out.println(name+" "+age+" ");} } public class This01 {public static void main(String[] args){Dog dog1 = new Dog("大壯",3);System.out.println("dog1的hashcode = "+dog1.hashCode());dog1.info();Dog dog2 = new Dog("小東",7);System.out.println("dog1的hashcode = "+dog2.hashCode());dog2.info();} }class Dog {String name;int age;// public Dog(String dName,int dAge)// {// name = dName;// age = dAge;// }public Dog(String name,int age){this.name = name;this.age = age;System.out.println("this.hashCode = "+this.hashCode());}public void info(){System.out.println(name+" "+age+" ");} }this使用細節
01:
class T {public void f1(){System.out.println("f1ok");}public void f2(){System.out.println("f2ok");f1();this.f1();} }02:
class T {public T(){this("jack",100);System.out.println("T() 構造器");//在這里訪問T(String name,int age)//this("jack",100);//ERROR 注意:如果有this(參數列表);必須放在第一條語句}public T(String name,int age){System.out.println("T(String name,int age)構造器");}}案例
01:
public class TestPerson {public static void main(String[] args){} }class Person {String name;int age;public Person(String name,int age){this.name = name;this.age = age;}public boolean compareTo(Person p){return this.name.equals(p.name) && this.age==p.age;} });System.out.println("dog1的hashcode = "+dog2.hashCode());dog2.info();} }總結
以上是生活随笔為你收集整理的Java面向对象编程(基础部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++实现双栈结构(一个顺序表中使用两个
- 下一篇: 一个月瘦20斤可能吗