Java面向对象学习1
标签(空格分隔): Java
面向对象的两个要素:
类:对一类事物的描述,是抽象的,概念上的定义
对象:是实际存在的该类事物的每个个体,因而称为实例(instance)
面向对象程序设计的重点是类的设计
设计类:就是设计类的成员
Java类及类的成员
一、设计类、其实就是设计类的成员
属性 = 成员变量 = field = 域、字段
方法 = 成员方法 = 函数 = method
创建类的对象 = 类的实例化 = 实例化类
案例:设计一个“人”的类
class Person{
//属性
String name;
int age = 9;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(){
System.out.println("人可以说话");
}
}
二、类和对象的使用(面向对象思想落地的实现):
1、创建类,设计类的成员
2、创建类的对象
3、通过“对象.属性”或“对象.方法”调用对象的结构
案例:"人"的类和对象的使用
//测试类
public class study1 {
public static void main(String[] args){
//创建Person类的对象
Person p1 = new Person();
//调用对象的结构:属性、方法
//调用属性:”对象.方法“
p1.name = "Tom";
p1.isMale = true;
//输出
System.out.println(p1.name);
//调用方法:”对象.方法"
p1.eat();
p1.sleep();
p1.talk("chang");
}
}
//类
class Person{
//属性
String name;
int age = 9;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是" + language);
}
}
三、如果创建了一个类的多个对象,则每一个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
类中属性的作用
属性(成员变量) VS 局部变量
相同点:
1.1 定义变量的格式,数据类型 变量名 = 变量值
1.2 先声明,后使用
1.3 变量都有对应的作用域不同点:
2.1在类中声明的位置不同
属性:直接定义在类中的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部结构的变量
2.2关于权限修饰符的不同
属性:可以在声明属性时,使用权限修饰符
常见的权限修饰符:private、public、缺省、protected
目前,声明属性时,都使用缺省即可
局部变量,不可以使用权限修饰符
2.3默认初始化值的情况
属性:类的属性,根据其类型,都有默认的初始化值
引用数据类型:(类、数组、接口):null
2.4在内存之加载的位置不同
属性:加载到堆空间
局部变量加载到栈空间
局部变量:没有默认的初始化值
意味着,我们在调用局部变量之前,一定要赋值
特别的,形参调用时,我们赋值
class User{
//属性(或成员变量)
String name;
int age;
boolean isMale;
public void talk(String language){//language:形参,也是局部变量
System.out.println("我们使用"+language+"进行交流");
}
public void eat{
String food = "烙饼";//局部变量
System.out.println("北方人喜欢吃"+food);
}
}
类中方法的作用
1. 方法:描述类应该具有的功能
比如:Math类:sqrt()\random()\...
Sanner类:nextXxx()...
Arrays类:sort()\binarySearch()...
举例:
public void eat(){}
public String getName(String nation){}
2. 方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体
}
注意:static、final、abstract用来修饰的方法(后面会细讲
3. 说明:
3.1关于权限修饰符,默认方法的权限修饰符使用public
Java规定的4种权限修饰符:private、public、缺省、protected//用来修饰权限,约束权限的大小
3.2返回值类型,有返回值,无返回值
3.2.1如果方法有返回值,则必须在方法声明时,指定返回值的类型,同时,方法中,需要使用return关键字来返回指定类型的变量或常量
如果方法有返回值,则方法声明,使用void来声明,不需要使用return,要使用则使用【return;】起到结束方法的作用
3.2.2我们定义方法该不该有返回值
①有要求
②凭经验
3.3:方法名,属于标识符,遵循标识符的规则和规范,“见名之意”
3.4形参列表,方法可以声明0个、1个或多个。
3.4.1格式:数据类型1 形参1,数据类型2 形参2,.....
3.4.2我们定义方法时,该不该定义形参?
①题目要求
②凭经验
3.5方法体:方法功能的实现
4:方法的使用,可以调用当前类的属性或方法
特殊的方法中调用当前方法:递归方法
关于变量的数据类型
如果数据是基本数据类型,此时赋值的是变量所保存的数据值
如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址
方法的形参的传递机制:值传递
- 形参:方法定义时,声明的小括号内的参数
实参:方法调用时,实际传递给形参的数据 - 值传递机制
如果参数是基本数据类型,此时实参赋给形参的是实参真实储存的数据值
如果参数是引用数据类型,此时实参赋值给形参的是实参的是实参存储数据的地址值
例题:引用
public class study1 {
public static void main(String args[]){
study1 test = new study1();
test.first();
}
public void first(){
int i = 5;
Value v = new Value();
v.i = 25;
second(v,i);
System.out.println(v.i);
}
public void second(Value v, int i){
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i+" " + i);
}
class Value{
int i = 15;
}
}
15 0
20
案例:定义一个int型的数组:int[] arr =new int[]{12,3,3,34,56,77,432};让数组的每个位置上的值除去首位置的元素,得到的结果,作为该位置上的新值
答案:
//错误写法
for(int i = 0; i < arr.length; i++){
arr[i] = arr[i] / arr[0];
}
//正确写法1
for(int i = arr.length-1;i>=0; i--){
arr[i] = arr[i] / arr[o]
}
//正确写法2
int temp = arr[0];
for(int i = 0; i < arr.length; i++){
arr[i] = arr[i] / temp;
}
案例://p212//需要在method方法被调用之后,仅仅打印出a = 100; b = 200;请写出method方法的代码
public class study1 {
public static void main(String[] args){
int a = 10;
int b = 10;
method(a,b);
}
}
法一:
public static void method(int a,int b){
a = a * 10;
b = b * 20;
System.out.println(a);
System.out.println(b);
System.out.println(c);
方法二;//p212
public static void method(int a,int b){
PrintStream ps = new PrintStream(System.out){
@Override
public void println(String x){
if("a = 10".epuals(x){
x = "a = 100";
}else if{"b = 10".equals(x){
x = "b = 200";
}
super.println(x);
}
};
System.setOut(ps);
}
案例:
public class study1 {
public static void main(String[] args){
int[] arr = new int[]{1,2,3};
System.out.println(arr);//[I@5594a1b5//正常输出地址
char[] arr1 = new char[]{'a','b','c'};
System.out.println(arr1);//abc//printlr(char[])的定义即为输出chars数组
}
}
递归调用
示例:
public class study1 {
public static void main(String[] args) {
study1 test = new study1();
int sum1 = test.getSum(100);
System.out.println(sum1);
}
public int getSum(int n){
if(n==1){
return 1;
}else{
return n +=getSum(n-1);
}
}
}
匿名对象
我们创建的对象,没显示的赋给一个变量名,即为匿名对象
特点:匿名对象只能调用一次
举例:
new Phone().sendEmail();
new Phone().playGame();
new Phone().price = 1999;
new Phone().showPrice();//0.0
应用场景:
PhoneMall mall = new PhoneMall();
//匿名对象的使用
mall.show(new Phone());
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
可变个数形参的方法
《需要补充》
值传递
string类:
public class study1{
public static void main(String[] args){
String s1 = "Hello";//字符串常量值不可变
study1 test = new study1();
test.change(s1);
System.out.println(s1);//Hello
}
public void change(String s){
s = "hi~~";
}
}
基本数据类 :
public class study1{
public static void main(String[] args){
int s1 = 1;
study1 test = new study1();
test.change(s1);
System.out.println(s1);//1
}
public void change(int s){
s = 2;
}
}
public class study1 {
public static void main(String[] args){
Animal a = new Animal();
a.age = 12;
a.legs = 4;
a.name = "小七";
a.show();//*name = 小七,age = 12,legs = 4*
a.age = a.change(a.age);
a.show();//*name = 小七,age = 2,legs = 4*
}
}
class Animal{
int age;
int legs;
String name;
public void show(){
System.out.println("name = "+ name+",age = "+ age+",legs = " + legs);
}
public int change(int s){
s = 2;
return s;
}
}