Java面向对象学习

4 面向对象

  • 对象=属性+方法;
  • 对象的规范=属性定义+方法定义。
4.1对象和类的概念
  • 对象是一个变量;
  • 类就是类型(是规范,是定义),从对象中抽取共性;
  • 类规定了对象应该有的属性内容和方法;
  • 对象是实例,是类的一个实现,是一个具体的东西。
4.2 Java类和对象
  • 最简单的类 class A{} //没有任何属性和行为;

  • 对象 A obj = new A();
    例:

    int a = 5;==>等价为 int a = new int(5)
    类型 变量名 = new 类型(参数)
    

:A obj1 = new A();A obj2 = new A(); obj1和obj2是两个不同的对象,在内存中有不同的存放地址。

  • 对象赋值是Reference 赋值,而基本类型是直接拷贝赋值

    public class ReferenceTest 
    {
        public static void main(String[] args) 
        {
            int num1 = 5;
            int num2 = num1;//拷贝
            System.out.println("num1: " + num1 + ", num2:" + num2);//输出5,5
            num2 = 10;
            System.out.println("num1: " + num1 + ", num2:" + num2);//输出5,10
    
            MyNumber obj1 = new MyNumber();
            MyNumber obj2 = new MyNumber();
            System.out.println(obj1.num);//5
            System.out.println(obj2.num);//5
            System.out.println("=====接下来输出新值=====");
    
            obj2 = obj1;//指向同一个数
            obj2.num = 10;//改变指向的数
            System.out.println(obj1.num);//10
            System.out.println(obj2.num);//10
        }
    }
    
    public class ArgumentPassingTest 
    {
        public static void main(String[] args) 
        {
            int a=1,b=2;
            swap(a,b);
            System.out.println("a is " + a + ", b is " + b);//a=1,b=2
    
            MyNumber obj1 = new MyNumber();
            MyNumber obj2 = new MyNumber();
            obj2.num = 10;
            swap(obj1,obj2);
            System.out.println("obj1 is " + obj1.num + ", obj2 is " + obj2.num);//a=1,b=2
            
        }
        public static void swap(int m,int n)
        {
            //交换不了
            int s = m;//拷贝赋值
            m = n;
            n = s;
        }
        public static void swap(MyNumber obj3,MyNumber obj4)
        {
            //正常交换
            int s = obj3.num;//指向
            obj3.num = obj4.num;
            obj4.num = s;
        }
        
    }
    
  • 函数内的局部变量,编译器不会给默认值,需要初始化后才可使用;类的成员变量,编译器会给默认值,可以直接使用。

public class Initialization 
{
    boolean v1;
    byte v2;
    char v3;
    double v4;
    float v5;
    int v6;
    long v7;
    short v8;
    public static void main(String[] args) 
    {
        Initialization obj = new Initialization();
        System.out.println(obj.v1);//false
        System.out.println(obj.v2);//0
        System.out.println(obj.v3);//'\u0000'
        System.out.println(obj.v4);//0.0d
        System.out.println(obj.v5);//0.0f
        System.out.println(obj.v6);//0
        System.out.println(obj.v7);//0L
        System.out.println(obj.v8);//0
    }
}
4.3构造函数(constructor function)
  • 构造函数的名称必须和类名一样,且没有返回值

    public class A 
    {
        int id;
        public A(int id2)//构造函数
        {
            id = id2;
        }  
    }
    A obj = new A(10);调用构造函数复制id
    
  • Java有构造函数,但是没有析构函数(构造函数是制造对象的过程,析构函数是清除对象的过程)

  • Java提供了字自动回收机制JVM因此不需要析构函数来释放内存

  • 每个变量都是有生命周期的,它只能存储在离它最近的一对{}中

    public class LifeCycleTest 
    {
        public static void main(String[] args) 
        {
            int a = 0;//a在main函数中都是active
            for(int i=0;i<5;i++) //i只能活在for循环中
            {
                int k = 0;
                k++;
            }
            if(a>0)
            {
                Object obj1 = new Object();//obj1只能在if分支中有效
                System.out.println("a is positive");
            }
            else
            {
                Object obj2 = new Object();//obj2只能在else分支中有效
                System.out.println("a is non-positive");
            }
        }
    }
    
  • 当变量被创建时,变量将占据内存;当变量消亡时,系统将回收内存

  • 每个Java类都必须由构造函数

  • 如果没有显示定义构造函数,Java编译器会自动给该类产生一个空的无形参构造函数

    class A{}//类
    //编译器自动增加一个无参空的构造函数
    class A()
    {
    	public A() {}//无参构造函数
    }
    
  • 每个子类的构造函数的第一句话,都默认调用父类的无参数构造函数super(),除非子类的构造函数第一句话是super,而且super语句必须放在第一条。

  • 一个类可以有多个构造函数,只要形参列表不相同即可(和函数重载类似,函数名相同,形参不同)

  • 在new 对象的时候,会根据实参的不同,自动挑选相应的构造函数

    class MyPairNumber 
    {
        int m;
        int n;
        public MyPairNumber()
        {
            m = 0;
            n = 0;
        }
        public MyPairNumber(int a)
        {
            m = a;
            n = 0;
        }
        public MyPairNumber(int a,int b)
        {
            m = a;
            n = b;
        }
    }
    public class ConstructorTest 
    {
        public static void main(String[] args) 
        {
            MyPairNumber obj1 = new MyPairNumber();
            MyPairNumber obj2 = new MyPairNumber(5);
            MyPairNumber obj3 = new MyPairNumber(10,20);
            System.out.println("obj1 has " + obj1.m + "," + obj1.n);
            System.out.println("obj2 has " + obj2.m + "," + obj2.n);
            System.out.println("obj3 has " + obj3.m + "," + obj3.n);
        }
    }
    
4.4信息隐藏和this指针
  • 信息隐藏
    类的成员属性,是私有的private;

    类的方法是公有public的,通过方法修改成员属性的值。

class InfoHiding
{
    private int id;
    public InfoHiding(int id2)//构造函数初始化参数
    {
        id = id2;
    }
    public int getId()
    {
        return id;
    }
    public void setId(int id2)
    {
        id = id2;
    }
}
public class InfoHidingTest 
{
    public static void main(String[] args) 
    {
        InfoHiding obj = new InfoHiding(100);
        obj.setId(200);//通过方法修改类属性值
        System.out.println(obj.getId());//200,不能写成obj.id(非法)
    }
}
  • VScode中快速为属性添加get和set方法
  1. 鼠标右击空白处—>点击源代码操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9ivohf8-1596522966259)(https://i.loli.net/2020/08/04/OSfaec5zZGhKt4l.png)]

  1. 点击Generate Getters and Setters

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPc7aAfy-1596522966263)(https://i.loli.net/2020/08/04/sYdOA5cupiwXteR.png)]

  1. 勾选需要添加get和set方法的属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nua7IzhA-1596522966265)(https://i.loli.net/2020/08/04/oNzcUHWE6eiYfk4.png)]

  • this指针负责指向本类中的成员变量
public class Person 
{
    private int height;
    private int weight;
    private int age;
    private String name;

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } 
}
  • this负责指向本类中的成员方法
    this.weight = weight;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }

  • this负责指向本类中的成员方法

  • this可以代替本类的构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值