类与对象
1、类的声明
/*
类型-》class声明
类是对象的抽象,对象是类的具体表现形式。
属性-》成员变量
行为-》方法
*/
public class Person {
String name;
int age;
int height;
int weight;
public static void main(String[] args) {
int x = 1;
//声明Person类型的变量,并创建Person类型的对象。
Person p = new Person();
//访问对象的成员(引用.成员名)
p.name = "张三";
p.age = 10;
p.height = 100;
p.weight = 50;
//仅仅只是声明了引用类型的变量,并没有创建
//真正的对象。真正的对象是通过new来创建的。
Person p2;
}
}
2、成员变量
/*
成员变量
直接声明在类的内部的变量称为成员变量。
成员变量的作用域为整个类。
如果局部变量与成员变量同名,则在局部变量的作用域内,
局部变量将会遮蔽同名的成员变量。
如果想访问被局部变量所遮蔽的成员变量,可以通过this
进行访问。
*/
public class Member {
//成员变量
int x = 1;
public void f() {
//局部变量
int x = 2;
//访问局部变量x
System.out.println(x);
//访问成员变量x
System.out.println(this.x);
}
public void g() {
//访问成员变量x。
System.out.println(x);
}
public static void main(String[] args) {
Member m = new Member();
m.f();
//m.g();
}
}
3、方法
/*
方法
访问权限 返回类型 方法名(参数列表) {
方法体
}
参数列表:
参数类型1 参数名1,参数类型2 参数名2, ……
参数类型n 参数名n
如果方法没有返回值,使用void。
程序设计原则:
不要让相同的代码重复出现。原因:
1 重复的代码会造成代码量膨胀,冗余。
2 重复的代码不利于程序的维护。(程序更新时,
所有重复的代码都需要更新)
使用方法的优势:
避免代码的重复,实现代码的重用。
当调用一个方法时,程序流程就会跳转到方法声明处,依次
执行方法体语句,当所有语句执行完毕时,程序流程会返回
到方法的调用端。继续执行方法调用之后的语句。
*/
public class Method {
public static void main(String[] args) {
/*
//过于繁琐,不妥。
System.out.println("*");
System.out.println("**");
System.out.println("***");
System.out.println("****");
System.out.println("*****");*/
/*
使用循环来进行输出,有了一定的改善。
但是,依然会带来代码重复。
*/
/*for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
//其他操作
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}*/
Method m = new Method();
//调用方法
m.printStar();
//其他的操作
m.printStar();
}
public void printStar() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
/*
含有参数的方法
在方法声明中的参数称为形式参数。
在方法调用中的参数称为实际参数。
在方法调用时,实际参数会依次的赋值给
对应的形式参数。
*/
public class Method2 {
public void compute(int a, int b) {
//int a = 10;
//int b = 5;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
}
/*
public void compute() {
int a = 20;
int b = 10;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
}
*/
public static void main(String[] args) {
Method2 m = new Method2();
//byte s = 30;
m.compute(2, 3);
m.compute(10, 5);
//m.cpmpute(s, 10);
}
}
/*
方法的返回值。
return 会令方法提前结束。
return后的语句不会得到执行。
当方法没有返回类型(void)时,
也可以使用return。此时return后
不能有具体值。
return可以返回一个值,当我们需要方法能够
返回多个值时,可以使用数组(集合)来实现。
*/
public class Method3 {
public int add(int a, int b) {
int sum = a + b;
//使用return返回一个值。
/*if (a > 10) {
return sum;
} else {
return 30;
}*/
//System.out.println("****");
//return 100;
return sum;
//System.out.println("***");
//return a + b;
}
//返回类型为数组类型,这样就可以返回多个值。
public int[] compute(int a, int b) {
/*return a + b;
return a - b;
return a * b;
return a / b;
*/
int[] result = new int[4];
result[0] = a + b;
result[1] = a - b;
result[2] = a * b;
result[3] = a / b;
return result;
}
public void f(int age) {
if (age <= 0) {
return;
}
//对年龄进行的操作。
}
public static void main(String[] args) {
Method3 m = new Method3();
//int x = m.add(1, 1);
int[] y = m.compute(10, 5);
//变量y与compute方法中的result指向了同一个数组
//对象。在compute方法结束后,方法中创建的数组对象
//还可以继续使用。
System.out.println(y[0]);
//return;
}
}
4、变量的默认值
/*
变量的默认值
成员变量具有默认值。布尔类型为false,数值类型为0
(整数类型byte,short,int,long为0,float,double为0.0),
char为'\u0000',引用类型为null。
局部变量没有默认值,如果尝试去使用一个尚未初始化的
局部变量,将会产生编译错误。(如果仅声明,但不使用
尚未初始化的局部变量,没有问题。)
数组元素如果没有显式的初始化,也具有默认值,默认值与
对应类型的成员变量一致。
*/
public class DefaultValue {
boolean bool;
byte b;
short s;
int i;
long l;
char c;
float f;
double d;
String str;
int[] array;
public static void main(String[] args) {
DefaultValue v = new DefaultValue();
System.out.println(v.bool);
System.out.println(v.b);
System.out.println(v.s);
System.out.println(v.i);
System.out.println(v.l);
System.out.println(v.c);
System.out.println(v.f);
System.out.println(v.d);
System.out.println(v.str);
int x;
//错误,局部变量没有默认值。
//System.out.println(x);
System.out.println(v.array);
v.array = new int[5];
System.out.println(v.array[0]);
}
}
5、NULL值
/*
null值
null是引用类型的字面常量值。null可以赋值给
任意的引用类型。表示该引用变量没有指向有效
的对象。
如果一个引用变量为null,我们通过该引用变量
去访问类中声明的成员,将会在运行时产生
NullPointerException异常(编译时没有错误)。
*/
public class Null {
public static void main(String[] args) {
String s = null;
int[] x = null;
//错误,运行时会产生异常。
System.out.println(x.length);
}
}
6、创建对象
/*
通过new创建对象,分配在堆内存中。
每通过new创建一个对象,都会在堆中分配一块独立的
空间,这意味着,每个对象都有自己的成员变量(实例),
彼此之间不受干扰。如果一个对象改变了自己成员变量的值,
不会对其他对象造成影响。
*/
public class CreateObject {
int x = 1;
public static void main(String[] args) {
CreateObject o1 = new CreateObject();
CreateObject o2 = new CreateObject();
System.out.println(o1.x);
System.out.println(o2.x);
o1.x = 100;
System.out.println(o1.x);
//o2对象的成员变量不会因为o1对象的改变而改变。
System.out.println(o2.x);
}
}
7、参数传递
/*
参数传递
1 参数类型是基本数据类型
2 参数类型是引用类型
当参数是基本数据类型时,形参参数(形参)的改变
不会反作用于实际参数(实参)。
*/
public class Pass {
public static void main(String[] args) {
Pass p = new Pass();
int x = 1;
int y = 2;
p.swap(x, y);
System.out.println(x);
System.out.println(y);
}
public void swap(int a, int b) {
//a = x;
//b = y;
int temp = a;
a = b;
b = temp;
System.out.println(a);
System.out.println(b);
}
}
/*
参数是引用类型时的参数传递
当参数类型是引用类型时,通过形参可以改变实参
指向对象的值(对象的成员变量)。
因为实参与形参指向了同一个对象。
*/
public class Pass2 {
public static void main(String[] args) {
Value v1 =new Value();
v1.v = 1;
Value v2 = new Value();
v2.v = 2;
Pass2 p = new Pass2();
p.swap(v1, v2);
System.out.println(v1.v);
System.out.println(v2.v);
}
public void swap(Value x, Value y) {
int temp = x.v;
x.v = y.v;
y.v = temp;
}
}
class Value {
int v;
}
/*
参数传递总结:
Java中,无论参数是基本数据类型,还是引用类型,传递
的方式一律是按值传递。这就是说,形式参数的改变,无法
影响实际参数。
对于参数是引用类型时,通过形参可以改变实参所指向对象
的值,但是,依然无法改变实参本身的值。(对象的起始地址)。
*/
public class Pass3 {
public static void main(String[] args) {
Value v1 =new Value();
v1.v = 1;
Value v2 = new Value();
v2.v = 2;
Pass3 p = new Pass3();
p.swap(v1, v2);
System.out.println(v1.v);
System.out.println(v2.v);
}
public void swap(Value x, Value y) {
x = new Value();
x.v = 2;
y = new Value();
y.v = 1;
}
}

浙公网安备 33010602011771号