Java 面向对象知识巩固(学习笔记,施工中)

2020-04-11   83 次阅读


前言

看别人的代码也是需要知识的,这不这几天在看别人写的代码,是Java,各种面向对象,因为Java一年前学的,好多东西都忘了,而且基本没有系统性的学习过Java的面向对象,因此为了以后做项目以及工作,这次就来系统学习一下
本文主要来自菜鸟教程

继承

java继承就是子类继承父类的特征与行为
使得子类对象具有父类的实例域与方法
继承使用extends关键字来申明
格式

class ParentClass{
}

class ChildClass extends ParentClass{
}

继承的理由

其实很好理解的,举个例子,我们开发一个动物类
我们最耳熟能详的小强,这是百度百科中的内容

 
门:节肢动物门 
亚门:六足亚门 
纲:昆虫纲 
亚纲:有翅亚纲 
目:蜚蠊目 
科:蜚蠊科 

每个门,纲都包含了数十种甚至数百种动物
如果每种动物都定义属性,务必会造成巨大的代码冗余,会显得十分臃肿
因此我们可以将这些动物共有的属性以及方法整合到一个父类中
比如动物的体重,体长,食物
方法包括eat,sleep等属性

在子类继承了父类之后,可以调用super方法来调用父类中的方法与属性

public class Animal { 
    private String name;  
    private int id; 
    public Animal(String myName, int myid) { 
        name = myName; 
        id = myid;
    }
}

public class Penguin extends Animal { 
    public Penguin(String myName, int myid) { 
        super(myName, myid);   //调用父类的构造方法
    } 
}

Java不支持多继承,但是支持多重继承
也就是代码中不支持诸如

public class C extends A,B{}

的代码

多重继承就是套娃式继承,B类继承A类,C类继承B类,D类继承C类....

关于继承的一些注意事项

  • 父类中private的方法与属性不能被继承
  • 子类可以自己声明树形与方法,也就是可以对父类进行扩展
  • 子类可以用自己的方式实现父类的方法

implements关键字

使用该关键字可以变相的使java具有多继承的属性
可以同时继承多个接口 (接口与接口之间采用逗号分隔)

范例(来自菜鸟教程)

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

this关键字
指向自己的引用

public class Animal { 
    private String name;  
    private int id; 
    public Animal(String myName, int myid) { 
        name = myName; 
        id = myid;
    }
    void eat(){
	System.out.println("父类吃");
	}
}

public class Penguin extends Animal { 
    public Penguin(String myName, int myid) { 
        super(myName, myid);   //调用父类的构造方法
    } 
	void eat(){
	System.out.println("子类吃");
	}
	void test(){
	super.eat();  //调用父类的eat方法
	this.eat();   //调用自己的eat方法
	}
}

final 关键字
可以将类声明为不可继承类
final class 类名{}

重写与重载

重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写
形参不能改变
重写的好处就是子类可以根据需要定义自己的行为
重写方法不能抛出新的检测异常或者比被重写方法声明更加宽泛的异常
范例(来自菜鸟教程)
父类的一个方法申明一个检查异常IOException,子类重写方法时不能抛出Exception,因为ExceptionIOException的父类

注意事项

  • 参数列表必须与被重写方法的相同
  • 返回类型与被重写方法的返回类型可以不同,但是必须是父类返回值的派生值(java5以及更早版本返回类型要一样)
  • 声明为final的方法不能被重写
  • 访问权限不能比父类中被重写方法的访问权限更低
    • 父类中声明为public,重写时不能生命为protected
  • 构造方法不能被重写
  • 声明为static的方法不能被重写,但是能被再次声明

重载(Overload)

在同一类中,方法名字相同,而参数不同
每个重载的方法都必须有一个独一无二的参数类型表

范例

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 "returntest3";
    }   
 
    public String test(String s,int a){
        System.out.println("test4");
        return "returntest4";
    }
}

这边重载了四个构造函数

菜鸟教程中定义了一个表格可以更好地彰显重写与重载的区别

区别点重载重写
参数列表必须修改不能修改
返回类型可修改不能修改
异常可修改可减少或者删除,不能抛出更广泛(原方法抛出错误的父类)
访问可修改不能做更严格的限制

END

———目前学到这里已经足够了,以后有需要在学习(花式水博客)———

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议