一個蒟蒻萌新的Java之路

2018.8.9 HelloWorld!


  閒來無事,想起了還有java這個世界上最好的語言(別再強調是PHP了~

  人生第一個用java實現的Hellworld,紀念一下!

			
public class HelloWorld {
		public static void main(String []args) {
			System.out.println("Hello World!");
		}
}

  一入此門深似海吶,瞭解了java的輸入輸出,數組的創建。通過 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串,在讀取前我們一般需要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據。

import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		Scanner io = new Scanner(System.in);
		int min = 1000;
		int[] array = new int [10];
		for(int i = 0; i < 10; i++) {
			array[i] = io.nextInt();
		}
		for(int i = 0; i < 10; i++) {
			if(array[i] < min)
				min = array[i];
		}
		System.out.println(min);
	}
}

 2018.8.10 Are you sure?

   菜雞第二天看完清華大神鄭莉老師的視頻才知道,原來輸入流還要關閉。

import java.util.Scanner;

public class Test2 {
	public static void main(String[] args) {
		Scanner io = new Scanner(System.in);
		int[] array = new int [10];
		for(int i = 0; i < 10; i++) {
			array[i] = io.nextInt();
		}
		io.close();
		int tmp;
		for(int i = 0; i < 10; i++) {
			for(int j = 0; j < 9-i; j++) {
				if(array[j] > array[j+1]) {
					tmp = array[j];
					array[j] = array[j+1];
					array[j+1] = tmp;
			    }
			}
		}
		for(int i = 0; i < 10; i++) {
			System.out.print(array[i] + " ");
		}
	}
}

2018.8.11 回車一下

next() 與 nextLine() 區別

next():

  1. 一定要讀取到有效字符後纔可以結束輸入。

  2. 對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。

  3. 只有輸入有效字符後纔將其後面輸入的空白作爲分隔符或者結束符。

  4. next() 不能得到帶有空格的字符串。

nextLine():

  1. 以Enter爲結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。
  2. 可以獲得空白。
import java.util.Scanner;
 
public class Test3 {
    public static void main(String[] args) {
        Scanner io = new Scanner(System.in);
        int i = 0;
        float f = 0.0f;
        System.out.print("輸入整數:");
        if (io.hasNextInt()) {
            i = io.nextInt();
            System.out.println("整數數據:" + i);
        } 
        else {
            System.out.println("輸入的不是整數!");
        }
        System.out.print("輸入小數:");
        if (io.hasNextFloat()) {
            f = io.nextFloat();
            System.out.println("小數數據:" + f);
        } 
        else {
            System.out.println("輸入的不是小數!");
        }
        io.close();
    }
}

  


2018.9.6 lili姐畫了一節課流程圖+Java繼承 

  lili姐說沒事多練練……眼過千遍,不如手過一遍(當然也看不了一千遍

Java繼承

  繼承就是子類繼承父類的特徵行爲,使得子類對象(實例)具有父類的實例域方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。

 類的繼承格式

  在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:

class 父類 {
}
 
class 子類 extends 父類 {
}

繼承類型

  需要注意的是 Java 不支持多繼承,但支持多重繼承

  

繼承的特性

  • 子類擁有父類非private的屬性,方法。
  • 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。

  • 子類可以用自己的方式實現父類的方法。

  • Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。

  • 提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯繫越緊密,代碼獨立性越差)。

  • 繼承可以使用 extendsimplements 這兩個關鍵字來實現繼承,而且所有的類都是繼承於 java.lang.Object,當一個類沒有繼承的兩個關鍵字,則默認繼承object(這個類在 java.lang 包中,所以不需要 import)祖先類。

  extends關鍵字 

  在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。

public class Person { 
    private String name;   
    private int id; 
    public Person(String Name, String Id) { 
        //初始化
    } 
    public void eat() {  //喫飯屬性的實現  } 
    public void sleep() { //睡覺屬性的實現  } 
} 
 
public class Boy  extends  Person{ 

}

implements關鍵字

  規矩是死的,人是活的!!!

使用 implements 關鍵字可以變相的使java具有多繼承的特性,使用範圍爲類繼承接口的情況,可以同時繼承多個接口。

public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void show();
}
 
public class C implements A,B {

}

super 與 this 關鍵字

super關鍵字:我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前對象的父類。

this關鍵字:指向自己的引用。


class Person {
    void eat() {
    	System.out.println("Person : eat");
    }
}
 
class Boy extends Person {
    void eat() {
    	System.out.println("Boy : eat more");
    }
    void eatTest() {
    	this.eat();   // this 調用自己的方法
    	super.eat();  // super 調用父類方法
    }
}
 
public class Test10 {
	public static void main(String[] args) {
	    Person p = new Person();
	    //p.eat();
	    Boy b = new Boy();
	    b.eatTest();
	}
}

final關鍵字

final 關鍵字聲明類可以把類定義爲不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫。

final class 類名 {
    //類體
}

2018.9.13 Java重寫Override與重載Overload

  lili姐頻繁拿對象數組舉例,我連對象都。。。攤手

重寫Override

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值形參都不能改變。即外殼不變,核心重寫!

重寫的好處在於子類可以根據需要,定義特定於自己的行爲。 也就是說子類能夠根據需要實現父類的方法。

當需要在子類中調用父類的被重寫方法時,要使用super關鍵字。

class Persons extends Object{
		private String Name;
		private int Age;
		private int High;
		
		public String getName() {
			return Name;
		}
		public int getAge() {
			return Age;
		}
		public int getHigh() {
			return High;
		}
	
		public Persons(String name,int age,int high) {
			this.Name = name;
			this.Age = age;
			this.High = high;
		}
		
		//重寫string
		public String toString() {
			return (Name + " " + Age + " " + High);
		}
}

public class Test12 {

	public static void main(String[] args) {
			
		int n,age,high;
		String name;
		Persons[] people = new Persons[5];

		people[0] = new Persons("Peter",17,175);
		people[1] = new Persons("Alice",18,176);
		people[2] = new Persons("Rose",19,177);
		people[3] = new Persons("Tom",20,178);
		people[4] = new Persons("Grown",21,179);
			
	        for(int i = 0; i < people.length; i++) {
				System.out.println(people[i]);
		}
}

 重載Overload

重載(overloading) 是在一個類裏面,方法名字相同,而參數不同。返回類型可以相同也可以不同。

每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。

最常用的地方就是構造器的重載

重載規則

  • 被重載的方法必須改變參數列表(參數個數或類型不一樣)。
  • 被重載的方法可以改變返回類型
  • 被重載的方法可以改變訪問修飾符
  • 被重載的方法可以聲明新的或更廣的檢查異常。
  • 方法能夠在同一個類中或者在一個子類中被重載。
  • 無法以返回值類型作爲重載函數的區分標準。 

小結

方法的重寫(Overriding)和重載(Overloading)是java多態性的不同表現,重寫是父類與子類之間多態性的一種表現,重載可以理解成多態的具體表現形式。


2018.10.11 Java抽象類與接口

抽象類 (abstract)

在Java語言中使用abstract class來定義抽象類。 

在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。

抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構造方法的訪問方式和普通類一樣。

由於抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因爲這個原因,通常在設計階段決定要不要設計抽象類。

父類包含了子類集合的常見的方法,但是由於父類本身是抽象的,所以不能使用這些方法。

在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。 

抽象方法

abstract關鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名,而沒有方法體。

抽象方法沒有定義,方法名後面直接跟一個分號。

public abstract class Shape
{
   private double length;
   
   public abstract double getArea();    //獲取面積
   
   public abstract double getCircumference();   //獲取周長

   //其餘代碼
}

敲黑板!!!

  • 如果一個類包含抽象方法,那麼該類必須是抽象類。
  • 任何子類必須重寫父類的抽象方法,或者聲明自身爲抽象類。
class Circle extends Shape{
	
	public double getArea() {
		return length * length * Math.PI;
	}
	
        public double getCircumference() {
                return Math.PI * length * 2;
        }
}

 小結

  • 抽象類不能被實例化,如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創建對象。

  • 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現。

  • 構造方法,類方法(用static修飾的方法)不能聲明爲抽象方法。

  • 抽象類的子類必須給出抽象類中的抽象方法具體實現,除非該子類也是抽象類。

接口(interface)

接口並不是類,編寫接口的方式和類很相似,但是它們屬於不同的概念。類描述對象的屬性和方法,接口則包含類要實現的方法。

接口無法被實例化,但是可以被實現。一個實現接口的類,必須實現接口內所描述的所有方法,否則就必須聲明爲抽象類。

聲明:

[可見度] interface 接口名稱 [extends 其他的接口名名] {
        // 聲明變量
        // 抽象方法
}

定義接口 :

public interface Shape {
	public double getArea();
}

 實現接口:

class Circle implements Shape{
	double length;
	public double getArea() {
		return length * length * Math.PI;
	}
	Circle(double r) {
		length = r;
	}
}
class Rectangle implements Shape{
	double length;
	double width;
	public double getArea() {
		return length * width;
	}
	Rectangle(double l,double w) {
		length = l;
		width = w;
	}
}
public class Test1 {
	public static void main(String[] args) {
		Circle c = new Circle(2);
		Rectangle r = new Rectangle(4,5);
		System.out.println(c.getArea());
		System.out.println(r.getArea());
	}
}

運行結果: 

12.566370614359172
20.0

接口特點: 

  • 接口是隱式抽象的,當聲明一個接口的時候,不必使用abstract關鍵字。
  • 接口中每一個方法也是隱式抽象的,聲明時同樣不需要abstract關鍵字。
  • 接口中的方法都是公有的。

接口與類相似點:

  • 一個接口可以有多個方法。
  • 接口文件保存在 .java 結尾的文件中,文件名使用接口名。

接口與類的區別: 

  • 接口不能用於實例化對象。
  • 接口沒有構造方法。
  • 接口中所有的方法必須是抽象方法。
  • 接口不能包含成員變量,除了 static 和 final 變量。
  • 接口不是被類繼承了,而是要被類實現。
  • 接口支持多繼承。

接口和抽象類的區別 :

  • 抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是接口中的方法不行。
  • 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的。
  • 一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章