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 定义变量的格式,数据类型 变量名 = 变量值
    1.2 先声明,后使用
    1.3 变量都有对应的作用域

  2. 不同点:
    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:方法的使用,可以调用当前类的属性或方法
    特殊的方法中调用当前方法:递归方法

关于变量的数据类型

如果数据是基本数据类型,此时赋值的是变量所保存的数据值
如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址

方法的形参的传递机制:值传递
  1. 形参:方法定义时,声明的小括号内的参数
    实参:方法调用时,实际传递给形参的数据
  2. 值传递机制
    如果参数是基本数据类型,此时实参赋给形参的是实参真实储存的数据值
    如果参数是引用数据类型,此时实参赋值给形参的是实参的是实参存储数据的地址值

例题:引用

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;
    }
}
posted @ 2024-08-08 11:21  我的十四行诗在哪里  阅读(1)  评论(0编辑  收藏  举报