使用Java实现面向对象编程——第一章 ji

时间:2024-01-21 09:07:03

1、 继承:

继承是面向对象的三大特征之一,是JAVA实现代码重用的重要手段之一;

继承是代码重用的一种方式,将子类共有的属性和行为放到父类中;

JAVA只支持单继承,即每一个类只有一个父类,继承表达的是:子类与父类是is-a关系;

在JAVA中,所有的JAVA类都直接或间接的继承了java.lang..Object类。Object类是所有JAVA类的祖先;

在定义一个类时如果没有使用extends关键字,那么这个类直接继承Object类;

继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),

在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类:

方便修改代码、减少代码

语法:class 子类 extends 父类

  ★子类就会自动拥有父类定义的某些属性和方法。

  ★不能被继承的父类成员:

    ●private成员

    ●子类与父类不在同包,使用默认访问权限的成员

    ●构造方法

 

        

        

 

 

父类:

 

 

狗类(子类(两种输出方式)):

 

企鹅类(子类(两种输出方式))

  

 

 

测试类:

 

第一中输出方式:super.

    

第二种输出方式:

     

 

 

第三种输出方式:

       

2、访问:

子类访问父类成员:

   使用super关键字来访问父类的成员,super代表父类对象

        super只能出现在子类的方法和构造方法中,而不是其他位置;

        可以访问父类的成员,如父类的属性、方法、构造函数;

       ◆ super调用构造方法时,只能是第一句

        注意访问的权限的限制,如super不能访问父类的private成员

 

     

    

    

 

访问修饰符

本类

同包

子类          

其他

private

 

 

 

默认(friendly)

 

 

protected

 

public

 

  子类可以从父类继承

    ◆父类的public修饰符的属性和方法;无论父类和子类是否在同一个包;

    ◆protected修饰符的属性和方法;无论父类和子类是否在同一个包;

    ◆默认修饰符属性和方法被子类继承了,子类和父类必须在同一个包;

  子类不可以从父类继承:

    ★父类的private修饰符的属性和方法不能被子类继承。

    ★无法继承父类的构造方法;

 

多重继承关系的初始化顺序:

 

继承条件下构造方法的调用规则:

  ◆如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没有super(); 语句的效果是一样的;

  ◆如果子类的构造方法中通过super显示调用父类的有参构造函数,则执行父类相应的构造方法,而不执行父类无参构造函数;

  ◆如果子类的构造函数中通过this显示调用自身的其他构造方法,则在相应构造方法中应用以上两条规则;

  ◆如果存在多级继承关系,则在创建子对象时,以上规则会多次向更高一级父类应用,一直执行到*父类Object类的无参构造方法为止;

注意:

  在构造方法中如果有this语句或者super语句出现,则只能是第一条语句;

  在一个构造方法中不允许同时出现使用this和super语句调用构造方法(否则就有两条第一条语句);

  在类方法中不允许出现this或super关键字;

  在实例方法中,thgis和super语句不要求是第一条语句,可以共存;

3、重写(overriding):在子类中可以根据需求对从父类继承的方法进行重新编写,成为方法的重写或方法的覆盖;

使用继承后效果:

使用重写效果:

 

方法重写的规则:

  方法名相同;

  参数列表相同;

  返回值类型相同或者是其子类;

  访问权限不能严于父类;

方法重载与方法重写:

 

位置

方法名

参数表

返回值

访问修饰符

方法重写

子类

相同

相同

相同或是其子类

不能比父类更严格

方法重载

同类

相同

不相同

无关

无关

  注:构造方法不能被继承,因此不能重写;

重载与重写:

   重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型,访问修饰符无关;

     方法重载简单的说:方法重载就是在类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。

    注意事项:

      1、方法名相同

      2、方法的参数类型,个数,顺序至少有一项不同

      3、方法返回类型可以不同(只是返回类型不一样,不能构成重载)

      4、方法的修饰符可以不同(只是控制访问修饰符不同,不能构成重载)

     重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类;

4、抽象类:

abstract也可用于方法——抽象方法

  eg:

  public abstract void print();

 注

  抽象方法没有方法体

  抽象方法必须在抽象类里

  抽象方法必须在子类中被实现,除非子类是抽象类

 

 每个子类的实现也不同:

public abstract class Pet {

       public void print() {

               //…

       }

}

 

抽象类是java中一个比较重要的类。

  1、用abstract关键字来修饰一个类时,这个类就是抽象类。

  2、用abstract关键字来修饰一个方法时,这个方法就是抽象方法。

  3、abstract抽象类中的abstract抽象方法是不允许在抽象类中实现的,一旦实现就不是抽象方法和抽象类了。abstract抽象方法只能在子类中实现。

  4、抽象类中可以拥有实现方法。

抽象类--注意事项

  1、抽象类不能被实例化

  2、抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract抽象方法。

  3、一旦类包含了abstract抽象方法,则这个类必须声明为abstract抽象类。

  4、当一个子类继承的父类是abstract抽象类的话,需要把抽象类的抽象方法全部实现。

  5、可以有0~多个抽象方法;

  6、非抽象类必须重写父类的所有抽象方法;

  7、抽象方法不能有主体。

            正确的抽象方法例:abstract void abc();

            错误的抽象方法例:abstract void abc(){}

父类:

    

狗类(子类):@override用于检测是否为重写

           

测试类:

     

输出结果:

     

5、final关键字:final:最后的,最终的。final可以修饰变量或者方法。

1、当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰。

2、当不希望类的某个变量的值被修改,可以用final修饰。如果一个变量是final,则必须赋初值,否则编译出错。

3、当不希望类被继承时,可以用final修饰。

注:

1、final修饰的变量又叫常量,一般用XX_XX_XX来命名。(带下划线)

2、final修饰的变量在定义时,必须赋值,并且以后不能再赋值。

            final float reate_1=3.1415926f  //圆周率不让修改,带有final修饰的变量命名时应有_下划线来区分表示

            final float reate_1=3.1415926f;//使用final可以保证,需要强制不被修改的数据一定要用final锁定

            final int b=0;  //定义类型后应赋值,使用final定义变量时一定要赋初值否则报错。

            final public void sendMes(){}//给成员方法用final来修饰则表示不可以被修改,不可被覆盖。

    final class Bbb extends Aaa{}//定义类前加final表示该类不允许被继承

Penguin类不再被其他类继承

 //最终版的类

public final class Penguin extends Pet {

      //…

}

方法不被重写

//最终版的方法

public final void print () {

      //…

}

属性值不被修改

 //最终版的属性值

public class Penguin {

       final String  home ="南极";// 居住地

       public void setHome(String name){

       this.home=home; //错误,不可再赋值

    }

}

错误示例://使用final修饰引用型变量,变量的值是固定不变的,而变量所指向的对象的属性值是可变的

class Dog {

    String name;

    public Dog(String name) {

        this.name = name;

    }

}

class Test {

    public static void main(String[] args) {

        final Dog dog = new Dog("欧欧");

        dog.name = "美美";

        dog = new Dog("亚亚");   //使用final修饰引用型变量,变量不可以再指向另外的对象

    }

}

6附加1:包

包--三大作用

1、区分相同名字的类

2、当类很多时,可以很好的管理类

3、控制访问范围

包--换包命令

package com.自定义名字;

注意:打包命令一般放在文件开始处。

包--如何引入包

语法:import 包;

包--命名规范

小写字母

比如 com.sina.shunping

 

包--常用的包

一个包下,包含很多的类,java中常用的包有:

java.lang.* 包      自动引入

java.util.* 工具包

java.net.* 包      网络开发包 

java.awt.* 包 窗口工具包

  附加2:

●方法重写是在两个类存在继承关系时,子类可以重写父类中的同名方法,要求参数列表相同,访问权限不能严于父类,返回值类型与被重写方法相同或是其子类;

●java.lang包中Object的equals方法将比较两个对象是否相等,如果相等则返回true.

  1.==是判断两个变量或实例是不是指向同一个内存空间

     equals是判断两个变量或实例所指向的内存空间的值是不是相同

  2.==是指对内存地址进行比较

     equals()是对字符串的内容进行比较

  3.==指引用是否相同

     equals()指的是值是否相同

注意:默认(friendly)访问修饰符的反访问范围是本来和同包中访问。

JAVA只支持单继承,并且子类无法继承父类的构造方法;

●static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:

类名.静态方法名(参数列表...)

类名.静态变量名

●eg:

 

分析:

面向对象三个特性是封装、继承、多态,其中,java的类是单继承的,不支持多继承,

即extends关键字后只能有一个类名称,即直接父类。

继承是is-a的相互关系,将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。

由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,

第2和3行都是向上转型(即可以子类对象赋给父类类型变量,反之,则不对),第1行创建自己类型的对象,自然也是正确的

●父类如果写了有参数构造而没写无参构造,默认无参构造将无法调用,这时子类构造也就无法调用父类无参构造

(子类无参构造默认调用super()且写在第一行。);

●抽象类可以有子类,抽象类不能被实例化,抽象类中除了有抽象方法外,也可以有普通实例方法,声明抽象类和抽象方法都要使用abstract关键字

●抽象类不能使用私有访问修饰符修饰(即不能用private修饰);

抽象方法不能使用final进行修饰(final和abstract不能同时修饰一个方法);

抽象方法不能有实现。

抽象类不能创建对象,

抽象类的引用可以指向实现其抽象方法的子类的对象。

定义抽象类时,abstract关键字放在class之前;

●abstract是用来修饰抽象类的(abstract修饰符可修饰类和方法,不能修饰属性;)。

                    abstract型方法用于被子类实现,所以只能是public、protected关键字所修饰;

抽象类中可以同时存在抽象方法和非抽象方法,需要注意的是有抽象方法的类一定是抽象类。

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块;

final修饰类中的属性或者变量,无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。

final修饰类中的方法,作用:可以被继承,但继承后不能被重写。final修饰类,作用:类不可以被继承。

interface关键字是用来定义修饰接口的。与抽象想法不同的是,接口里的方法全都是抽象方法。

●抽象类和接口的区别:

 

●JAVA方法的特点:抽象、继承、多态;

 

●使用super可以调用父类的公有方法,调用父类的属性及父类的构造方法。并且,子类构造方法调用父类构造方法时,必须放在第一行;

●super明确显式地指出一个类可以它父类的构造函数、方法和变量;

调用父类的属性,一个类中如果有int x属性,如果其子类中也定义了int x属性的话,

在子类中调用父类的x属性时应用super.x,表示该x是引用的父类的属性,

而要表示子类中的x属性的话,使用this.x。调用父类方法也可以通过该关键字实现;

●如果没有使用super显示调用父类的构造函数,将自动调用默认构造函数;

 ●super关键字,在子类对象内部指代其父类对象的引用,可以用来调用父类中的成员。但是不能够直接将super输出。

●main方法的格式讲解public static void main(String[] args){}

public:公共的,访问权限最大的,由于main方法是被jvm调用的,所以权限要够大

static:静态的,不需要创建对象,通过类名就可以,方便jvm的调用

void:方法的返回值是返回给调用者,而main方法是被jvm调用,你返回内容jvm调用,你返回内容给jvm没有意义

main:是一个常见的方法入口,语言都是以main作为入口

String[] args:这是一个字符串数组,值去哪里了?这个东西早起是为了接受键盘录入的数据的。

●public:所有的类都可以访问。

private:只有在同一个类中才可以访问。

protected:同一个类中、同一个包中、子类中都可以访问,包类型的。

默认类型:同一个类中、同一个包中可以访问到

●final修改的类不能是抽象的,abstract修饰的方法要求子类中必须重写,final修饰的方法要求不能重写可以重载,

可以被static修饰,final和static可以同时去修饰类、变量和类的方法,顺序没有要求;

Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

final修饰的为基本类型的,变量将变成常量。必须要在常量声明时对其进行初始化,常量名一般使用大写字母来表示,

字符常量使用单引号括起来,字符串常量使用双引号;

使用final关键字修饰一个变量为引用类型,是指引用地址不能变,引用变量所指向的对象中的内容还是可以改变的;

●final类不能被继承,没有子类,final类中的方法默认是final的。

final方法不能被子类的方法覆盖,但可以被继承。

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

final不能用于修饰构造方法。