第二章java与面向对象
一:举个面向对象的例子——我要去新疆,如果是面向过程编程,需要做我开车,我挂档,我踩油门,我过收费站等等一系列的步骤。如果是面向对象编程就是我命令车去新疆,车怎么去新疆封装在一个类中,我不需要了解车运动的过程。
二:java与面向对象
1:对象是java程序的核心,在java程序中万事万物皆对象
2:对象可以看作静态属性(成员变量)的封装体。
3:jdk提供了很多类供大家使用。
4:面向对象提高了代码的复用性和可扩展性。
5:用class关键字来定义一个类,类主要有两方面组成:成员变量和方法。成员变量可以是java语言中任意一种数据类型,成员变量的作用范围是整个类。java语言除了基本的数据类型外,其他的全部都是引用类型。
6:类是静态的概念,位于代码区,对象是new出来的位于堆区,类的成员变量在不同的对象中有不同的值,方法只有一份,只有在运行的时候占据内存。
7:必须使用new关键字来创建一个对象,使用对象.成员变量来访问,使用对象.方法来调用方法,如果是静态的成员变量或者方法,则用类名来访问。
8:每个类的对象都有自己的成员变量的存储空间。
9:内存解析:定义一个对象,先在栈区分配一个空间,名字为对象名,实际存放一个指向堆区的地址,在堆区存放成员变量,在方法中形参也会在栈区分配内存,名字为形参名字,值为实参的值,如果将一个对象赋值给形参,则形参的值为实参指向堆区的地址,也就是实参与形参都指向同一个地址。
三:构造方法
1:使用new+构造方法来创建一个新的对象。
2:构造函数定义在java类中用来初始化对象的函数。
3:构造函数与类同名且没有返回值。
4:当没有构造函数,系统自动的添加,一旦定义,系统不在添加。
四:约定俗成的命名规则
1:类首字母大写
2:变量名 方法名小写
3:运用驼峰标识,例如HelloWorld
五:方法的重载
是指一个类中可以定义有相同的名字但参数不同的多个方法,调用时会根据不同的参数来调用(主要是参数类型不同,或者参数的个数不同)是多态在编译时的一个表现。
六:this关键字
1:在类的方法的定义中使用的this关键字来调用该方法,也就是在堆区中和成员变量一起有个this,它指向这个对象本身。
2:有时使用this可以解决成员变量和参数重名的情况。
3:this可以看作一个变量,它的值是当前对象的引用。’
七:static关键字
在类中,用static声明的成员变量为静态成员变量,它为该类的变量不属于某一个对象所有。static成员变量只有一份属于类所有。用static声明的方法为静态方法,在调用时,static方法不可以访问非晶态的成员。
八:package 和 import 语句
1:为便于管理大型软件系统中数目众多的类,解决类的命名冲突的问题,java引用包的机制,来提供多重的命名空间。
2:package语句作为第一条语句,指明该文件定义类所在的包,若缺该语句则为无名包。
3:java编译器对应于文件系统的目录管理,在package语句中用.来指明包的层次 例如:package com.sun 则相应的文件必须位于com 文件下的sun文件夹下 。如果类放在包里,则应把文件放在正确的目录下,如果在另外的文件中调用这个类,两种方法:1 把这个类的名字写全,2 开头用import语句引入相应的类。此时应该注意这个class文件在classpath路径下。
4:jar 包其实是一些.class文件,jdk中除了java,lang中的包 其他的包要用都需要引入。
打成jar包的命令:jar -cvf xxx(自己设定的名字).jar *.*(子目录)
5:添加jar包所在的目录到classpath目录下,也可以找到class文件。
九:类的继承与权限控制
1:java使用extends关键字来实现类的继承
2;通过继承,子类拥有基类的所有成员(成员变量和方法)
3:java只支持单继承,不许多继承,也就是说一个子类只有一个父类。
4:具体的权限见图
5:在子类中根据需要对父类的方法进行重写(主要因为父类的方法不够具体或者不够满意),重写的方法必须有被重写的方法有具有相同的方法名称,参数列表和返回类型,重写的方法不能使用比被重写的方法更严格的访问权限。
十:super关键字
super在java中用来访问基类的成分,例如super.f(),f()是基类定义的方法,它和this关键字在堆区占用类似,不同的是它指向父类的成分。同样在继承 子类函数初始化的时候 一般都需要用super 对父类进行初始化。
十一:继承中的构造方法
1:子类的构造的过程中必须调用基类的构造方法。
2: 用super调用,且写在第一行,例如super(300);
3:如果没有显式的调用父类的构造函数,则系统默认为调用父类没有参数的构造函数。
4:如果没有显式的调用而且系统没有无参的构造函数,则会报错。
5:先调用父类的构造方法 在调用子类的构造方法。
6:this(参数),则调用自己类中另外的构造函数。
7:object类是java的根基类。
十二:对象转型
1:父类对象可以指向子类引用,只能看到父类本身的部分
2:如果在一个方法中void f(Animals a). c 是从Animals 继承后实例华的对象,则c也可以作为实参传入f(),这样增加了函数的可扩展性。
十三:多态
1:编译时的多态,主要是由函数的重载来实现的。
2:运行时的多态,三个必要条件 1:要有继承2:要有重写3:父类对象指向子类引用,这时父类具体指向谁,执行谁的方法。
十四:抽象类和接口
1:abstract修饰,只要含有抽象方法,必须为抽象类,抽象类必须被继承,抽象方法必须被重写,且抽象类不能被实例化。
2:接口是一种特殊的抽象类,不用abstract修饰,所有的方法都是抽象方法,都需要重写,它的存在主要解决java单继承的问题,因为一个类可以实现多个接口。而且所有的成员变量都是静态的。
3:final关键字 其修饰的方法不能被重写 修饰的成员变量的值不能被改变,修饰的类不能被继承。
内存图: