JavaSE 面向对象01

在这里插入图片描述

概述

程序: 数据结构&算法。
面向对象:先决定如何组织数据,再决定如何操作数据;先设计类,再添加方法。
instance:创建类的实例也就是由类构造对象。
封装:将数据行为组合起来,并对对象的使用者隐藏数据的实现方式;实例域(instance field)存放数据,行为即方法(method)操作数据。
类之间的关系:依赖、聚合、继承。

  • 依赖:use、偶然性、临时性。例如类B作为类A的方法参数,局部变量,返回值等。
  • 关联:必然的、长期的。例如类B作为类A的成员变量。
  • 聚合:has、加强版的关联,整体和部分的关系。
  • 继承:is、
    构造器:创建类的对象并初始化实例域(属性)。
    对象变量:引用对象,而不是变量处包含了对象。

  • final
    修饰基本数据类型:值不可变。
    在这里插入图片描述
    修饰引用:引用的对象不可变,但是引用的对象的属性可以变。
public class Finaltest {

	public static void main(String[] args) {
		final StringBuilder sb = new StringBuilder("abc");
		sb.append("de");
		System.out.println(sb);
        
	}

}

在这里插入图片描述

  • this
    表示隐式参数,可以将实例域和局部变量区分。
    构造器的第一行写this,表示这个构造器将调用类的另一个构造器。
  • private
    私有方法不会被外部的其他类调用
public class S1 {
	private int numb;
	private String name;

	public S1(int numb, String name) {
		super();
		this.numb = numb;
		this.name = name;
	}

	private int getNumb() {
		return numb;
	}

	public String getName() {
		return name;
	}

}

在这里插入图片描述

  • static 静态
  • 静态方法不能访问实例域(成员变量),因为它不能操作对象。
    在这里插入图片描述
  • 静态方法可以通过类调用,也可以通过类的对象调用,但是后者容易造成混淆,实际上方法的执行结果和对象没有任何关系。
    (前边学的线程sleep是不是因为这个?)是的。
    在这里插入图片描述
    在这里插入图片描述

方法参数

  • 按值调用:方法接收的是调用者提供的值。
  • 按引用调用 :方法接收的是调用者提供的变量地址。
    java只有一种情况,传值调用,即方法得到的值是参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
public class CallByTest {
	public static void main(String[] args) {
        int a = 1;
        int b = 2;
        swap(a,b);
        System.out.println("a="+a+" b="+b);
	}
	public static void swap(int num1, int num2) {
		int c = num1;
		num1 = num2;
		num2 = c; 
	}
}

在这里插入图片描述
在这里插入图片描述

  • 方法参数是对象的引用时
    拷贝的引用与原引用引用相同的对象。
public class CallByTest {
	public static void main(String[] args) {
//        Integer a = 1;
//        Integer b = 2;
//        swap(a,b);
//        System.out.println("a="+a+" b="+b);
		A a = new A(1);
		B b = new B(2);
		System.out.println("a="+a.num+" b="+b.num);
		swap(a,b);
		System.out.println("a="+a.num+" b="+b.num);
	}

	public static void swap(A oba, B obb) {
        int c = oba.num;
        oba.num = obb.num;
        obb.num = c;
        System.out.println("交换完毕");
	}
}

class A {
	int num;

	public A(int a) {
		this.num = a;

	}
}

class B {
	int num;

	public B(int a) {
		this.num = a;

	}
}

在这里插入图片描述
在这里插入图片描述

  • 如何证明java中只有 按值调用
    对象引用也是按值调用的,即方法不能让对象参数引用一个新的对象。例子中对象本身直接参与交换。
public class CallByTest {
	public static void main(String[] args) {
//        Integer a = 1;
//        Integer b = 2;
//        swap(a,b);
//        System.out.println("a="+a+" b="+b);
		A a1 = new A(1);
		A a2 = new A(2);

		System.out.println("a1=" + a1.num + " a2=" + a2.num);
		swap(a1, a2);
		System.out.println("a1=" + a1.num + " a2=" + a2.num);
	}

	public static void swap(A oa, A ob) {
		A oc = oa;
		oa = ob;
		ob = oc;
		System.out.println("交换完毕");
	}
}

class A {
	int num;

	public A(int a) {
		this.num = a;

	}
}

在这里插入图片描述

对象

  • 如果没有在构造方法中显式地给对象实例域赋值,会自动滴给实例域赋予默认值,0、null、false。这么做不好,影响可读性。
  • 编写类没有无参构造,系统会自动提供一个无参构造;如果显示声明了有参构造,系统不再自动提供无参构造,使用无参构造创建新对象会报错。
实例域初始化
  • 构造器中赋值,有参构造。
  • 类声明时赋值,这样执行构造器之前先进行赋值操作,所有的对象实例域的值都相同。
  • 对象初始化块,就是一个代码块,建议放在实例域后面。先运行该初始化块,再执行构造器的主体部分。
  • 静态初始化:如果有,类在第一次加载时会进行静态初始化,之后再创建类的对象不会再进行这种初始化。
  • 执行顺序:
    在这里插入图片描述

  • 将类组织起来,可以避免命名冲突。
  • 使用方式:类名之前加完整的包名java.time.LocalDate today = java.time.LocalDate.now();;import导包。
  • 包作用域:没指定public、private 即默认的,default。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值