首頁 > Java > Java基礎 > 主體

java有哪三大特性

青灯夜游
發布: 2023-03-10 13:36:54
原創
26652 人瀏覽過

java的三大特性是:1、封裝,就是將類別的某些資訊隱藏在類別內部,不允許外部程式直接訪問,而是透過該類別提供的方法來實現對隱藏資訊的操作和存取。 2.繼承,就是子類別擁有父類別的所有屬性和方法,從而實現了實作程式碼的複用。 3.多態,就是父類引用指向子類對象,產生多種型態。

java有哪三大特性

本教學操作環境:windows7系統、java8版、DELL G3電腦。

Java的三大特性

物件導向三大特性:封裝、繼承、多型。

封裝:

  • 將類別的某些資訊隱藏在類別內部,不允許外部程式直接訪問,而是透過該類別提供的方法來實現對隱藏資訊的操作和訪問。

繼承:

  • 子類別擁有父類別的所有屬性和方法(除了private修飾的屬性不能擁有),從而實現了實現代碼的複用;

多態:

  • 使用父類別引用接受,不同的子類別的物件實例,父類別參考呼叫相同的方法,根據子類別不同的實例,產生不同的結果

1、封裝

1)什麼是封裝

概念:盡可能隱藏物件的內部實作細節,控制物件的修改及存取的權限。

存取修飾符:private (可將屬性修飾為私有,僅本類別可見)

#2)公共存取方法

以存取方法的形式,進而完成賦值與取值運算。

問題:依舊沒有解決到非法資料輸入!

  • 提供公共存取方法,以確保資料的正常輸入。
  • 命名規格:
  • 賦值:setXXX() //使用方法參數實作賦值
  • 取值:getXXX() //使用方法回傳值實作取值

3)範例

public static void main(String[] args) {
		int a;
		Num num = new Num();
//		传入值100
		num.setNum(100);
		System.out.println(num.getNum());
	}
登入後複製
private int a;

//	在调用get方法时,返回本类a的值
	public int getNum() {
		return a;
	}

//	接受传入的值100,并赋值给本类的a
	public void setNum(int num) {
		this.a = num;
	}
登入後複製

4)過濾有效資料

在公共的存取方法內部,加入邏輯判斷,進而過濾掉非法數據,以確保資料安全。

#5)總結

get/set方法是外部存取物件私有屬性的唯一通道,方法內部可偵測資料並篩選資料。

2、繼承

#1)程式中的繼承

  • 程式中的繼承,是類別與類別之間特徵和行為的一種贈與或獲得。
  • 兩個類別之間的繼承關係,必須滿足「is a」的關係。

2)父類別的選擇

  • #現實生活中,許多類別之間都存在著繼承關係,都滿足「is a」的關係。

  • 狗是一種動物、狗是一種生物、狗是一種物質。

  • 多個類別都可作為「狗」的父類,需要從中選擇最適合的父類。

  • 功能越精細,重合點越多,越接近直接父類別。

  • 功能越粗略,重合點越少,越接近Object類別。 (萬物皆物件的概念)

3)繼承

語法:class 子類別extends 父類別{ } //定義子類別時,顯示繼承父類別

public class 子类名 extends 父类名{
	
	//代码块
	}
登入後複製

應用程式:產生繼承關係之後,子類別可以使用父類別中的屬性和方法,也可定義子類別獨有的屬性和方法。

好處:既提高程式碼的複用性,又提高程式碼的可擴充性。

4)繼承的特點

Java為單一繼承,一個類別只能有一個直接父類,但可以多層繼承,屬性和方法逐級疊加。

5)不可繼承

建構方法:類別中的建構方法,只負責建立本類對象,不可繼承。

private修飾的屬性和方法:存取修飾符的一種,僅本類別可見。

父子類別不在同一個package中時,default修飾的屬性與方法:存取修飾符的一種,僅同套件可見。

3、方法重寫

#1)方法的重寫/覆寫

方法重寫原則:

  • 方法名稱、參數清單與父類別相同。
  • 傳回值類型必須與父類別相同或其子類別
  • 存取修飾符可與父類別相同或是比父類別更寬泛。

方法重寫的執行:

  • 子類別重寫父類別方法後,呼叫時優先執行子類別重寫後的方法。

  • 方法重寫的特性:

    子類別重寫父類別方法時子類別方法會覆寫父類別方法。

    子類別重寫父類別方法,存取層級不能嚴於父類別方法。

    子類別重寫方法名稱和類型與父類別一樣。

    父类的构造方法无法重写,只能被覆盖。

示例:

//父类
public class Animal {
//	父类中吃的方法会输出“玩玩玩”
	public void play() {
		System.out.println("玩玩玩");
	}

//	父类中睡的方法会输出“睡睡睡”
	public void sleep() {
		System.out.println("睡睡睡");
	}

}
登入後複製
/**
 * 狗类继承 父类
 */
public class Dog extends Animal {

//	进行方法重写,将方法重写输出为“狗玩飞碟”
	public void play() {
		System.out.println("狗玩飞碟");
	}
}
登入後複製
public class Test {

	public static void main(String[] args) {
		// 实例化宠物对象
		Dog d = new Dog();
		d.play();
		d.sleep();
	}

}
登入後複製

运行输出:

java有哪三大特性

2)方法重写与方法重载的区别

相同点:方法名相同
不同点:
重载:参数列表不同,返回值与访问修饰符无关
重写:参数列表相同,返回值相同或其子类,访问修饰符不能比父类更严

4、super关键字

1)super关键字

super关键字可在子类中访问父类的方法。

  • 使用”super.”的形式访问父类的方法,进而完成在子类中的复用;
  • 再叠加额外的功能代码,组成新的功能。

2)super调用父类无参构造

super():表示调用父类无参构造方法。如果没有显示书写,隐式存在于子类构造方法的首行。

3)super调用父类有参构造

super():表示调用父类无参构造方法。

super(实参):表示调用父类有参构造方法。
参构造被执行

4)this与super

this或super使用在构造方法中时,都要求在首行。
当子类构造中使用了this()或this(实参),即不可再同时书写super()或super(实参),会由this()指向构造方法完成super()调用。

class A{
		public A(){
		System.out.println(( "A-无参构造"));
		}
		public A(int value) {
		System.out.println(("A-有参构造")); 
		}
		}
		class B extends A{
		public B(){
		super();
		System.out.println( "B-无参构造");
		}
		public B(int value) {
//		super();这两货不能跟同时存在
		this();
		System.out.println(("B-有参构造"));
		}
		}
登入後複製

5、多态

概念:父类引用指向子类对象,从而产生多种形态。

二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。

父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。

1)多态的应用

方法重载可以解决接收不同对象参数的问题,但其缺点也比较明显。

  • 首先,随着子类的增加,Master类需要继续提供大量的方法重载,多次修改并重新编译源文件。
  • 其次,每一个feed方法与某一种具体类型形成了密不可分的关系,耦合太高。

场景一:使用父类作为方法形参实现多态,使方法参数的类型更为宽泛。

public class Animal {
//		父类中吃的方法会输出“玩玩玩”
	public void play() {
		System.out.println("玩玩玩");
	}

//	父类中睡的方法会输出“睡睡睡”
	public void sleep() {
		System.out.println("睡睡睡");
	}

}
登入後複製
/**
 * 狗类继承 父类
 * 
 * 
 *
 */
public class Dog extends Animal {

//	狗类特有的方法“狗吃狗粮”
	public void eat() {
		System.out.println("狗吃狗粮");
	}

}
登入後複製
public class Test {

	public static void main(String[] args) {
		// 实例化宠物对象
		Animal d = new Dog();
		d.play();
		d.sleep();
//		The method eat() is undefined for the type Animal
//		对于类型动物,eat()方法未定义
//		当我们去调用子类对象的特有方法时,就会爆出上面的错误提示
//		如果想要实现子类特有方法,就必须要强转
//		d.eat();
		((Dog) d).eat();
	}

}
登入後複製

运行输出:

java有哪三大特性

场景二:使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。

示例:

//动物类  父类
public class Animal {
	public void food() {
		System.out.println("...");
	}
}
登入後複製
//用extends关键字,继承父类属性
public class Dog extends Animal {

	public void food() {
		System.out.println("狗吃狗粮");
	}

	public void runing() {
		System.out.println("一直跑跑跳跳");
	}
}
登入後複製
//用extends关键字,继承父类属性
public class Fish extends Animal {
	public void food() {
		System.out.println("大鱼吃小鱼,小鱼吃虾米");
	}

	public void swimming() {
		System.out.println("小鱼儿,一直游");
	}
}
登入後複製
public class Master {
//	传入你的动物,并去给它喂食
	public void food(Animal animal) {
		System.out.println("喂食");
		animal.food();
	}
}
登入後複製
import java.util.Scanner;

public class Shopping {
//	你没有动物,所以animal为空
	Animal animal = null;

//	判断你要购买的宠物,并返回宠物类(狗、鱼)
	public Animal shopping(int a) {
		if (a == 1) {
			animal = new Dog();
		} else if (a == 2) {
			animal = new Fish();
		}
//		this.animal=animal;
		return animal;
	}

	public void showMenu() {
		Scanner input = new Scanner(System.in);
		System.out.println("欢迎来到一只宠物宠物店");
		System.out.println("请选择喜欢的宠物:");
		System.out.println("1.狗 2.鱼 ");
		int a = input.nextInt();
		Animal animal = shopping(a);
		Master mm = new Master();
		mm.food(animal);
//		用instanceof判断你买的是狗还是鱼。
//		狗就执行狗的属性和方法,鱼就执行鱼的属性和方法
		if (animal instanceof Dog) {
			Dog d = (Dog) animal;
			d.runing();
		} else if (animal instanceof Fish) {
			Fish f = (Fish) animal;
			f.swimming();
		}

	}
}
登入後複製
//测试类
public class text {
	public static void main(String[] args) {
		Shopping shop = new Shopping();
		shop.showMenu();
	}
}
登入後複製

运行结果:

java有哪三大特性

2)多态的静态和动态实现

动态绑定:即为重写/覆盖,方法的重写

动态绑定也叫后期绑定,在运行时,虚拟机根据具体对象实例的类型进行绑定,或者说是只有对象在虚拟机中运行创建了之后,才能确定方法属于哪一个对象实例的

  • 根据实际对象是什么,就去找相应对象方法去执行。
  • 动态绑定是在运行时才会执行(例如重写的方法)。

静态绑定:即为重载,方法的重载

一个方法的参数在编译阶段常被静态地绑定,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数

  • 根据类型找相应的属性或者静态变量。
  • 静态绑定是在编译时执行(如成员变量,静态方法)。

更多编程相关知识,请访问:编程教学!!

以上是java有哪三大特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!