Java最重要的元素为类、对象、方法以及变量,
类:其中类是将一系列具有相同特点的对象方法和变量抽象出来形成的一个集体,对象是方法和变量的主体,方法和变量是对象的属性。
例如:卡车、小轿车、公共汽车(对象)有载客人数、运行速度、发动机功率等物理量(变量)以及转弯、加速、减速、刹车等功能(方法)
其中各类车属于实例对象将其抽象化形成了机车类
一个类中可以声明变量(体现对象的属性)、创建对象(创建对象包括声明对象以及为对象分配存储空间),定义方法(体现对象具有的行为功能),当某个对象是使用某个类的名字来声明的,那么这个对象便具有了这个类所定义的变量和方法
(对象的声明:类的名字 对象的名字+对象的名字 =new 类的名字()
类的名字 对象的名字=new 类的名字())
之后,在程序之中,可以根据对象+“.”+方法\变量来进行调用。
创建一个方法,根据此方法的类型来进行创建
(无返回值void /有返回值 返回值类型 ——有参数 括号中带参数 无参数 括号中无参数 (括号中为参数类型)):例如无返回值无参数类型直接使用void +方法名()有返回值无参数类型是用参数类型+方法名()无返回值有参数类型使用void +方法名(参数类型)有返回值有参数类型使用返回值类型+方法名(参数类型)
方法中给出算法,体现对象所具备的行为功能
类的变量
有成员变量和局部变量两种,其中在变量声明部分声明的变量称之为类的成员变量(整个类中的所有方法均有效),在类的方法体之中声明的变量称之为局部变量(只在声明它的方法内部有效)
成员变量又分为实例变量和类变量:声明成员变量时,用static修饰的变量为类变量(静态变量),否则为实例变量
如果成员变量和局部变量重名,成员变量暂时失效(被隐藏),如果在此方法之中想要使用成员变量需使用this.变量名
方法声明:
方法声明部分(返回类型 方法名){
方法体的内容
}
eg: float area(){
.....
}
方法重载:多态性的一种,例如求面积时会询问你求什么面积。功能多态:向功能传递
不同的消息,然后对象能根据相应的消息来产生相应的行为。
方法重载:一个类中可以有多个相同名字的方法但是每个方法的参数必须不同,即每个
方法的参数个数不同或每个方法的参数类型不同。例如:float getArea(float x){ return 3.14xx} float(int x,float y){算法} …根据不同的参数来选择不同的方法进行调用
构造方法 类中与类名相同的方法(构造方法没有类型),构造方法也可以进行重载(参数不同即可)
类中方法可以分为实例方法和类方法:方法类型前加static进行修饰的为类方法 不加static的为实例方法
需要注意问题:
1.对于成员变量的操作只能放在方法之中,方法可以对成员变量和该方法体中声明局部变量进行操作,在进行声明时可以对其进行赋值,但是不允许进行声明之后再进行赋值。
eg:class A{ int a=12; 方法体 } 错误表示:class A { int a;a=12; 方法体}
2.实例方法既能对类变量操作也能对实例变量进行操作,而类方法(static进行修饰)只能对类变量进行操作。
3.一个类之间的方法可以进行相互调用,但是类方法只能调用该类的其他类方法,而实例方法能调用该类的其他实例方法和类方法。
对象:用类声明的变量称之为对象,用类声明对象之后还需创建对象,即为声明的对象分配所拥有的变量
创建对象:包括对象的声明和为对象分配变量
对象的声明:一般格式:类的名字(类的本质是数据类型) 对象的名字
为声明的对象分配变量:使用new运算符和构造方法为声明的对象进行分配变量
eg:创建了XiyoujiRenwu此类,类中有name、head、weight、height等变量 speak方法
在主类中使用
XiyoujiRenwu Sunwukong=null; //声明对象
Sunwukong=new XiyoujjiRenwu(); //为声明对象分配变量
此处的XiyoujiRenwu()实际为XiyoujiRenwu中默认的构造方法 此后在主类之中可以通过对象+“.”操作符+变量\方法进行调用
类变量和实例变量的区别:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
类方法和实例方法的区别:同一个类中实例方法可以调用类中的其他实例方法和类方法,而类方法只能调用类中的类方法,不能调用实例方法。
this关键字的使用:
成员变量被局部变量隐藏时,只需要通过this.变量名即可调用被局部变量隐藏的成员变量
this关键字在类的构造方法之中表示使用该构造方法创建的对象
继承与接口:
子类能继承父类的所有变量和方法(构造方法除外),子类能对方法进行重写以及对变量类型进行重定义,当子类中重写的方法和变量与父类中的变量和方法重名之时,即为对方法和变量的隐藏,当需要使用父类之中的被隐藏的方法时使用super关键字(类似成员变量被局部变量隐藏时使用的This关键字)
子类继承父类使用extends进行继承,子类只允许有一个父类,但一个父类可以拥有多个子类
public 、protected、friendly、private
Class 子类名 extends 父类名{
…
}
成员变量的隐藏:
只要子类中声明的成员变量与父类中的成员变量名字相同,子类就隐藏了继承于父类的成员变量。但是子类可以使用继承于父类的方法来操作隐藏的成员变量。
方法重写:子类通过重写可以隐藏已继承的的实例方法
重写语法规则要求:重写方法需要与父类方法类型一致,并且方法的名字、参数个数以及类型均需保持一致。
重写目的:将自己的状态和行为赋值上去,如果需要使用隐藏的父类方法则需使用super关键字。
JDk对于重写的改进:子类在重写可以继承的方法时 如果父类的方法的类型是“类”的话(类属于一种数据类型),那么重写方法的类型可以是其(父类的方法类型“A类”)“子类”
Class A父类{ …方法1 }
Class A子类{ …重写方法1 }
Class B父类{ A父类 方法2() { … } }
Class B子类{ A子类 重写方法2() { … } }
重写注意事项:不可以降低方法的访问权限(可以提高或者不变但是不能降低)
Super关键字:
①调用父类的构造方法:子类可以隐藏从父类继承的成员变量和方法,如果子类中想要使用被子类隐藏的成员变量和方法,可以使用super关键字。
子类不继承父类中的构造方法(与类同名且没有返回值及类型,但是可能不止一个(方法重载)) ,如果子类想要使用父类的构造方法,必须在类的构造方法之中使用关键字super来表示,而且super必须是子类构造方法中的第一条。
父类的构造方法为Student(int number,String name){this.number=number;this.name=name;}
子类的构造方法为UniverStudent(int number,String name){super(number,name);}
②调用被隐藏的成员变量及方法:super.x,super.play 即为调用被隐藏的x变量以及play方法。
**final关键字:**可以用来修饰类、成员变量和方法中的局部变量
final修饰的方法不允许重写,final修饰的变量视作常量(例如 final double PI=3.1415926)不允许再发生变化(将某些重要的方法和变量定义为final类,例如Java的String类对编译器和解释器运行十分重要,不能轻易进行改变)
上转型对象,例如吉吉国王属于猴子,而猴子属于哺乳类动物
上转型对象特点:上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法;
上转型对象可以访问子类继承或者隐藏的成员变量,也可以调用子类继承的方法或者子类重写的方法。
例如:class A ;class B extends A; B b = new B(); A a = b;故a是b的上转型对象
继承与多态:
多态性:父类的某个方法被其子类进行重写时,可以各自产生自己的功能行为。
abstract类 :用astract修饰的类叫abstract类
abstract方法:只允许声明不允许实现(方法体中不进行算法编写),并且final和abstract不能修饰同一个方法
abstract类的特点:
1.abstract类中可以有abstract方法,但不一定必须有;
2.abstract类中不能使用new运算符创建对象;
3.抽象类存在的目的是为了便利人们进行设计,只关心操作,不在意细节,通过对抽象类子类继承方法的重写,再来完成对细节的编写。
abstract父类 对象 = new 非抽象子类() 此对象为上转型对象,可以调用非抽象子类中的重写方法来进行功能的实现。
接口:Java中子类至多只能有一个父类,为了解决单继承的问题,使用接口。
接口定义以及声明:
Interface 接口名字{
//接口体
}
接口体的使用:
class A implements 接口名字(可以多个接口){
类体
}
class 子类 extends 父类 implements 接口名字(可以多个接口){
…
}
接口回调:可以实现某一接口的类创建的对象的引用赋给该接口声明的接口变量之中。
内部类、匿名类、Lambda表达式、异常类
内部类:在一个类之中声明的另外一个类
外嵌类的成员变量在内部类之中依然有效,内部类的方法也可以调用外部类中的方法。
内部类的类体不可以声明类变量和类方法(一个类中的实例方法能调用其他方法而类方法只能调用类方法,不能调用实例方法)
内部类仅供它的嵌套类使用,其他类不能使用内部类声明对象。