面向对象编程
由于单独变量解决问题时,不利于数据的管理,使用数组解决时会有数据类型体现不出来的问题。为了解决不利于数据管理、效率低的问题,引入类与对象。
类与对象概述:
对象主要由属性和行为构成。
类就是定义数据类型。(int等为Java提供的数据类型。)即创建一个类时,相当于创建了一中新的数据类型。而对象是类的一个实例。
例如:定义一个人 类,那么张三这个人就是人 类一个实例--对象。
注意:创建/实例化一个对象、把类实例化都是从类到对象。
对象的创建:
格式: 类名 对象名=new 类型(参数);--创建并实例化对象。
例如:我们已经有了一个类,类名为 ren。
创建并实例化对象:ren diyigeren = new ren();
diyigeren.name=”张三”;
......
其中new ren();才是真正的对象!!!
如何访问对象的属性?
System.out.println(diyigeren.name);
属性(成员变量):
属性是类的一个组成部分。
格式:访问修饰符(public等) 属性类型 属性名;
如何创建对象?
格式1(先声明在创建):
ren diyigeren;
diyigeren = new ren();
格式2:
ren diyigeren = new ren();
代码:
public class hahaha {
static int b=1000;//类变量/静态变量,如果将static删去,lll.jiajiajia(b);会//报错。
public static void main(String [] ages)//main方法-程序的入口 {
jia lll=new jia();//创建并实例化对象。
lll.jiajiajia(b);/成员方法的调用。
}
}
class jia{
public void jiajiajia(int a) {
int aaa=0;
for(int i=1;i<=a;i++) {
aaa+=i;
}
System.out.println(aaa);
}
}
如果将成员方法public void jiajiajia(int a)写入public class hahaha时,
jia lll=new jia();要改为hahaha lll=new hahaha();
成员方法(无static关键字修饰)
方法不被调用时就不会有任何输出。
先创建对象,然后对象名。方法名调用即可。
成员方法的定义:
访问修饰符 返回数据类型 方法名(形参列表){
方法体;
return 返回值;
}
同样地,void表示无返回值。
注意:
访问修饰符的作用是控制方法的适用范围,不写则表示默认访问。
一个方法只能有一个返回值。
形参列表:一个方法可以有0或多个参数,多个参数用,隔开。
方法调用:
同一个类中的方法调用:直接调用即可。
例如:
成员方法调用成员方法
public class test {
public void method1() {
方法体;
methodB();
}
public void method2() {
方法体;
}
...
}
静态方法调用静态方法
静态方法是属于类本身的,无需创建类的实例即可调用。因此,一个静态方法要调用同一类中的另一个静态方法,同样可以直接使用方法名进行调用,无需任何额外的引用。
跨类中方法A类的调用B类中的方法:需要通过对象名调用。
传参机制:在方法值的传递中,若传递的数据类型为基本数据类型,那么传递的是真实的数据,形参的改变不影响实际参数的值,但如果是引用数据类型,那么传递的就是地址值,形参的改变影响实际参数的值。
方法的递归调用:
public class test1 {
public static void main(String [] args) {
KK k1=new KK();
k1.KKK(4);
int kkkk=k1.KKKK(5);
System.out.println(kkkk);
}
}
class KK{
public void KKK(int n) {
if(n>2) {
KKK(n-1);//方法的递归调用
}
System.out.println(n);
}
public int KKKK(int m) {
if(m==1) {
return 1;
}
else {
return KKKK(m-1)*m;//方法的递归调用
}
}
}
public void KKK(int n) {
if(n>2) {
KKK(n-1);//方法的递归调用
}
System.out.println(n);
当n满足n>2时,栈内一直开辟空间,此时n的值有n=4,n=3,n=2。当n=2时,不满足n>2,此时会输出n=2,然后返到n=3,并输出,再返回到n=4,并输出。
if(m==1) {
return 1;
}
else {
return KKKK(m-1)*m;//方法的递归调用
}
}
同样地,输出的结果为1*2*3*4*5。
注意:方法局部变量是独立的,不会相互影响。如果方法中使用的是引用类型数据,就会共享该引用该数据类型。
重载:
Java允许同一个类中多个同名方法的存在,但要求形参列表不一致。
注意:
构成重载方法的方法名必须相同。
形参列表必须不同(形参类型或个数或顺序)。
形参名无要求,返回类型无要求。
可变参数
Java允许将同一个类中多个同名同功能,但参数不同的方法,封装成一个方法,就通过可变参数实现。
格式:
访问修饰符 返回类型 方法名(数据类型...形参名){
方法体;
return 返回值;
}
public class test111 {
public static void main(String[] args) {
mm m1=new mm();
System.out.println(m1.mmm(1,2,3,4,5,6,7,8,9,8,7,5,2,5,5,6,6,5,5,56,6,56));
}
}
//int...表示接收的为可变参数,且类型为int
//此时sum相当于一个数组
class mm{
public int mmm(int... sum) {
int sum1=0;
for(int i=0;i<sum.length;i++) {
sum1+=sum[i];
}
return sum1;
}
}
实参可以是0或者任意多个,可变参数的实参也可以为数组。
可变参数可以和普通类型的参数一起放在形参列表中,但必须是可变参数在最后。(int n,int m,int...x)
一个形参列表中只能出现一个可变参数。(int...x,double...y)这种是错误的。