~~~~~~ Java可以根据业务定义自定义的数据类型,所有自定义的类型都属于引用类型。
~~~~~~ 定义一个类型的格式是 访问修饰符 类关键字(class) 类名{},如:
public class Person{
}
~~~~~~ 类像是一个模板,可以根据模板来创建具体的对象,一个类可以产生很多属于这个类的对象,也叫这个类的实例。
~~~~~~ 创建对象用运算符new: 类名 对象名 = new 类名();
Person p = new Person();//定义一个对象
~~~~~~ 我们可以在定义类的时候定义相关的属性,比如人的属性有名字、年龄、身高、体重等。在类中可以写成:
public class Person{
String name;
int age;
int height;
double weight;
}
~~~~~~ 这些属性是属于对象的,使用这些属性必须要通过实例化对象来完成
Person p = new Person();//定义一个对象
/*给对象的属性赋值,必须通过对象p来完成*/
p.name = "张三";//给对象的name属性赋值
p.age = 8;//给对象的age属性赋值
p.height = 172;//给对象的height属性赋值
p.weight = 75.5;//给对象的weight属性赋值
/*使用对象的属性,必须通过对象p来完成*/
System.out.println("名字:"+p.name);//输出name属性的值
System.out.println("年龄:"+p.age);//输出age属性的值
System.out.println("身高:"+p.height);//输出height属性的值
System.out.println("体重:"+p.weight);//输出weight属性的值
~~~~~~ 通过访问修饰符修饰属性来表明这些属性可以在那些范围内可以使用
关键字 | 描述 | 本类中 | 同包中 | 不同包中 |
---|---|---|---|---|
public | 公共的 | √ | √ | √ |
protected | 保护的 | √ | √ | 只能子类可以用 |
默认 | 默认的 | √ | √ | × |
private | 私有的 | √ | × | × |
~~~~~~ 静态属性是属于类所有,所有的对象都共享,使用静态属性用类名直接使用:
public class Person{
public static int max = 100;
}
System.out.println(Person.max);//通过类名就可以直接访问
~~~~~~ 我们在new一个对象的时候就是调用了这个类的构造方法
~~~~~~ 构造方法的名称与类名完全相同,没有任何返回类型:
public Person(){
}
~~~~~~ 构造方法也可以带参数:
public Person(String name,int age){
this.name = name;
this.age = age;
}
~~~~~~~ 带参数是为了给属性初始化,这样新建了对象后也就给对象的属性赋好值了。
~~~~~~~ 如果没有定义构造方法,系统会默认提供一个不带参数的构造方法,当定义了带参数的构造方法后,系统提供的不带参数的构造方法就被覆盖了,如果需要使用就需要我们自己再去定义这个无参数的构造方法。
~~~~~~~ 构造方法还可以根据参数的不同进行重载:
public Person(){
}
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
~~~~~~~ 这样就形成了重载,系统会根据你new对象是传入的参数来决定调用哪个构造方法。
~~~~~~~ 方法是解决问题的手段,就是为了完成某个特定的功能而定义的;方法与属性一样必须先声明后使用。
~~~~~~~ 方法必须定义在类中。
~~~~~~~ 方法的定义:
~~~~~~~ [访问修饰符] 返回类型 方法名称([参数列表]){
~~~~~~~ ~~~~~~~ 功能代码
~~~~~~~~~~~~~~~ [返回值return]
~~~~~~~ }
~~~~~~~ [ ]中内容代表可有可无。如:
public class Person{
public void say(){
System.out.println("您好!");
}
}
~~~~~~~ 方法是属于对象的,方法使用也必须靠对象来完成
~~~~~~~ 使用方式:对象名.方法名称([参数列表]);
Person p = new Person();
p.say();//使用p对象的say方法
~~~~~~~ 如果方法有返回值,就必须用return关键字返回一个值,返回值的类型要符合方法定义时的类型,当方法执行到return语句时就说明方法运行结束。
~~~~~~~ 如果方法中有多个return语句,就要保证只有一个return会被执行:
public double count(double n,double m,int tag) {
if (tag == 1) {
return n + m;
}else if (tag == 2) {
return n - m;
}else if (tag == 3) {
return n * m;
}else {
return n / m;
}
}
~~~~~~~ 在Java中,数据类型分为基本数据类型和引用数据类型两种,方法的参数中分为值类型和引用类型分别对应之前的基本数据类型和引用数据类型。
~~~~~~~ 基本数据类型的参数传递时称为值传递,等于传递了一份值的拷贝副本,这个副本发生改变不影响本身。比如计算两个数字放大10倍后的和:
public void getSum(int a, int b){
a = a * 10;
b = b * 10;
System.out.println(a);//输出50
System.out.println(b);//输出60
System.out.println(a+b);//输出110
}
public static void main(String[] args){
int a = 5;
int b = 6;
getSum(a,b);
System.out.println(a);//输出5
System.out.println(b);//输出6
}
~~~~~~~ 值传递的时候即使在方法中改变了参数的值,而参数原本的值不会被改变。除了String类型(因为String类型在Java中不可变,每修改一次就是新建一个String对象)外引用类型的参数在传递时称为地址传递,传的是参数在内存中的地址,只要发生改变就全部都变了。
public static void change(int[] nums){
for (int i : nums) {
System.out.print(i + "\t");//输出 1 2 3
}
System.out.println();
for (int i = 0; i < nums.length; i++) {
nums[i] = (i + 1) * 10;
}
for (int i : nums) {
System.out.print(i + "\t");//输出 10 20 30
}
System.out.println();
}
public static void main(String[] args){
int[] nums = {1,2,3};
change(nums);
for (int i : nums) {
System.out.print(i + "\t");//输出 10 20 30
}
}
~~~~~~~ 静态方法与静态属性一样是属于类的,用关键字static修饰,调用时用类名直接调用;静态方法只能调用静态方法和使用静态属性。
~~~~~~~ 方法重载时多态的特性,体现同名方法完成类似功能,业务算法有所不同。方法的重载与构造方法的重载一样。
~~~~~~~ 方法的重载要满足以下条件: