类与对象
1.类
例:创建一个猫类,里面有若干属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class cat { String name; int age; String color; } public static void main(String []args){ cat c1 = new cat(); c1.name = "小白"; c1.age = "1"; c1.color = "白色"; cat c2 = new cat(); System.out.println(c1.name+c.age+c1.color) }
|
2.属性/成员变量
定义:属性是类的一个组成部分,一般是基本的数据类型也可以是引用类型(数组、对象),比如上例中的int age 就是一个属性
注意:new cat()创建的是对象空间(数据)才真的是对象
3.创建对象的形式
1.先声明再创建
cat c1;
c1 = new cat();
2.直接创建
cat c1 = new cat();
3.如何访问属性
对象名.属性名
例:cat.name
……
4.成员方法(方法)
例:有person类,里面有2个属性,有一个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class person{ int age; String name; public void speak(){ System.out.println("我是新手"); } public void sum(int n){ int res = 0; for(int i = 0;i <= n;i++){ res = res + i; } } public summ(int sum1,int sum2){ int res = sum1+sum2; return res; } public static void main(Strint[]args){ person p1 = new person(); p1.speak(); p1.sum(5); int reset = p1.summ(5,10); System.out.println(reset); } }
|
方法的好处:
1.提高了代码的复用性
2.可以将细节封装起来,然后供其他用户来调用使用
方法注意事项:
1.一个方法最多只能有一个返回值
2.如果方法要求有返回值类型,则方法体中最后执行的语句必须为return 值;而且要求返回值类型必须和return的值类型一致或兼容
方法的传参机制:
1.基本数据类型,传递的是值(值拷贝),形参的任何改变不会影响实参;
2.引用类型传递的是地址(传递也是值,但值是地址),可以通过形参来影响实参;
5.方法的递归
个人理解:在方法中重复的调用方法
例:
1 2 3 4 5 6 7 8 9 10 11 12
| public static void main(String[]args){ T t1 = new T(); t1.test(4); } class T{ public void test(int n){ if(n>2){ test(n-1); } System.out.println("n=" + n); } }
|
上面的案例输出的结果为:
n = 2
n = 3
n = 4
例2:用递归求阶乘
1 2 3 4 5 6 7
| public int factorial(int n){ if(n == 1){ return 1; }else{ factorial(n-1)*n; } }
|
递归注意事项:
1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2.方法的局部变量是独立的,不会相互影响,比如n变量
3.如果方法使用的是运用类型变量,就会共享该引用类型
4.当一个方法执行完毕,或者遇到了return,就会返回,遵守谁调用,结果就返回给谁
6.方法重载
1.java中允许同一个类多个同名的方法,但是必须参数不同。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class test{ public static void main(String[]args){ MyCalculator mc = new MyCalculator(); System.out.println(mc.Calculator(1,2)); System.out.println(mc.Calculator(1,2.8)); System.out.println(mc.Calculator(1,2.1,11)); } } class MyCalculator{ public int calculator(int n1,int n2){ return n1+n2; } public double calculator(int n1,double n2){ return n1+n2; } public public calculator(int n1,double n2,int n3){ return n1+n2+n3; } }
|
7.可变参数
例:
1 2 3 4 5 6 7 8 9 10
| class m{ public int sum(int n,int x){ return n+x; } public int sum(int n,int x,int y){ return n+x+y; } ...... }
|
可改写为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
class Method{ public int m(int... n){ int res = 0; for(int i = 0;i< n.length;i++>){ res = res+n[i] } return res; } } public static void main(String[]args){ Method m1 = new Method(); System.out.println(m1.m(1,5,100)); }
|
注意细节:
1.可变参数的实参可以为0或任意多个。
2.可变参数的实参可以是数组。
3.可变参数的本质就是数组。
4.可变参数可以和普通类型的参数放在一起,但必须保证可变参数在最后
5.一个形参列表中只能出现一个可变参数。
8.作用域
注意事项:
1.属性和局部变量可以重名,访问时遵循就近原则;
2.在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名;
3.属性生命周期较长,对象无,则属性无;局部变量,生命周期短,代码块结束,局部变量无;
4.作用域范围不同
全局变量:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5.修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符
9.构造方法
语法:
[修饰符]方法名(形参列表){
方法体;
}
作用:完成对新对象的初始化
说明:
1.构造器的修饰符可以默认,也可以是public private
2.构造器没有返回值
3.方法名和类名一样
4.参数列表和成员方法一样的规则
5.构造器的调用系统完成
通过this调用其他的构造方法:
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class test { String name; int age; public test(String name) { this.name = name; } public test(String name,int age) { this(name); this.age = age; } public static void main(String[] args) { test person = new test("man",22); System.out.println(person.name); } }
|
例:
1 2 3 4 5 6 7 8
| class Person{ String name; int age; public Person(String pname,int page){ name = pname; age = page; } }
|
注意:
1.如果程序员没有定义构造方法,系统会自动给类生成一个无参构造方法,可以用javap反编译。
2.一旦定义了自己的构造器,则默认构造器就覆盖了
10.this关键字
java虚拟机会给每个对象分配this,代表当前对象
例:
1 2 3 4 5 6
| public Dog(String name,int age){ this.name=name; this.age=age; }
|
简单地说:哪个对象调用,this就代表了哪个对象
注意事项:
1.this关键字可以用来访问本类的属性、方法、构造方法
2.this用于区分当前类的属性和局部变量
3.访问成员方法的语法:this.方法名(参数列表);
4.this可以出现在实例方法和构造方法中,但不可以出现在类方法中
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public static void main(String []args){ T t1 = new T(); t1.f2(); } class T{ public void f1(){ System.out.println("f1()方法.."); } public void f2(){ System.out.println("f2()方法.."); f1(); this.f1(); } }
|
4.访问构造器语法:this(参数列表);只能在构造方法里使用(即只能在构造器中访问另外一个构造器,必须放在第一条语句)
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public static void main(String []args){ T t2 = new T(); } class T{ public T(){ this("haozi",100); System.out.println("T()构造器") } public T(String name,int age){ System.out.println("T(String name,int age)构造器") } }
|