Java重寫和重載
重寫是子類對父類允許通路的方法進行重新編寫,傳回值和形參不能變。
即外殼不變核心重寫
方法重寫 的規則:
1.參數清單必須與被重寫方法完全相同
2.傳回值類型可以不同,但必須是父類方法傳回值的派生類
3.通路權限不能比父類被重寫的方法權限低
4.父類成員方法隻能被子類成員重寫
5,final方法不能被重寫
6.static不能被重寫,但可以被重新聲明
7,構造方法不能被重寫
當需要在子類中調用父類的被重寫方法時,要用super關鍵字
```java
package java學習.重寫和重載;
class Animal{
public void move(){
System.out.println("動物可以移動");
}
}
class Dog extends Animal{
public void move(){
super.move();//應用super類
System.out.println("狗可以跑");
}
}
public class Override {
public static void main(String[] args) {
Animal a = new Animal();
a.move();
System.out.println();
Dog c = new Dog();
c.move();
System.out.println();
Animal b = new Dog();
b.move();
}
}
重載:是一個類裡面,方法名字相同,參數不同,傳回值不同
每個重載的方法必須有獨一無二的參數清單
最常用的是構造器重載
重載的規則:
1.被重載的方法 必須 改變參數清單(個數或類型不一樣)
2. 被重載的方法可以改變傳回類型
3,被重載的方法可以改變通路修飾符
4,被重載的方法可以聲明新的或更廣的檢查異常
5.方法能在一個類,或一個子類中被重載
package java學習.重寫和重載;
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
public String test(int a ,String s){
System.out.println("test3");
return "resulttest3";
}
public String test(String s,int a){
System.out.println("test4");
return "resulttest4";
}
public static void main(String[] args) {
Overloading o = new Overloading();
System.out.println(o.test());
System.out.println();
o.test(1);
System.out.println();
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
Java多态
多态是:同一個行為有多個不同表現形式或形态
多态就是一個接口,使用不同執行個體執行不同操作
多态的優點:
1.消除類型之間的耦合關系
2.可替換性
3.可擴充性
4.接口性
5.靈活性
6.簡化性
多态存在的三個必要條件:
1.繼承
2.重寫
3.父類引用指向之類對象 Parent p = new Child();
package java學習.多态;
public class Variety {
public static void main(String[] args) {
show(new Cat());
show(new Dog());
Animal a = new Cat();
a.eat();
Cat c = (Cat) a;
c.work();
}
public static void show(Animal a) {
a.eat();
if (a instanceof Cat) {
Cat c = (Cat) a;
c.work();
} else if (a instanceof Dog) {
Dog c = (Dog) a;
c.work();
}
}
}
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃魚");
}
public void work(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
@Override
void eat() {
System.out.println("吃骨頭");
}
public void work(){
System.out.println("看門");
}
}
Java抽象類
抽象類不能執行個體化對象,是以抽象類必須被繼承,才能使用。(是以在SEI階段決定不要使用抽象類)
Java中抽象類表示的是一種繼承關系,一個類隻能繼承一個抽象類,但一個類可以實作多個接口
package java學習.抽象類;
public abstract class Employee {
private String name;
private String address;
private int number;
public Employee( String name,String address,int number){
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay(){
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck(){
System.out.println("Email is check to " + this.name +" "+ this.address);
}
public String toString (){
return name+" "+address+" "+number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}
package java學習.抽象類;
public class Salary extends Employee {
private double salary;
public Salary(String name, String address, int number,double salary) {
super(name, address, number);
setSalary(salary);
}
public void mainCheck(){
System.out.println("Within mainCheck of Salary class ");
System.out.println("Mailing check to " + getName()+ "with salary "+ salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if (newSalary>=0.0){
salary = newSalary;
}
}
public double computePay(){
System.out.println("Computing salary pay for "+ getName());
return salary/52;
}
}
package java學習.抽象類;
public class AbstractDemo {
public static void main(String[] args) {
//Employee e = new Employee("ZHANGYANA ","CAIHU",43) ;
/**
* 抽象類不可初始化
*/
Salary s = new Salary("tt","usa",4,5300.00);
Employee e = new Salary("張亞楠","美國",3,5300.00);
System.out.println("Call mainCheck using Salary refercence --");
s.mainCheck();
System.out.println("\n Call mainCheck using Empolyee refercence -- ");
e.mailCheck();
}
}
Java接口
接口是Java程式設計語言中的一個抽象類型,是抽象方法的集合。
一個類通過繼承方法的方式,進而繼承接口的抽象方法。
類描述對象的屬性和方法
接口則包含類要實作的方法
除非實作接口的類是抽象類,否則該類要定義接口的所有方法。
接口不能執行個體化,但可以被實作。
Java中接口類型可以用來聲明一個變量,他們可以成為一個空指針,或者是被綁定的在一個以此接口實作的對象
接口的實作
package java學習.接口;
public interface Animal {
public void eat();
public void travel();
}
package java學習.接口;
public class MammalInt implements Animal{
@Override
public void eat() {
System.out.println("Mammal eats");
}
@Override
public void travel() {
System.out.println("Mannal travel");
}
public int noOfLegs(){
return 0;
}
public static void main(String[] args) {
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
接口的繼承
package java學習.接口;
public interface Sports {
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
package java學習.接口;
public interface Football extends Sports {
public void homeTeamScored(int points);
public void visitingTeameScored(int points);
public void endOdQuarter(int quater);
}
package java學習.接口;
import org.w3c.dom.events.Event;
public interface Hockey extends Sports, Event {//接口允許多繼承,類不允許多繼承
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
标記接口
package java學習.接口;
public interface EventListener {
/**
* 沒有任何方法的接口稱為标記接口
* 建立标記接口的目的:
* 1、建立公共的父接口
* 2、向一個類添加資料類型
*/
}