Java 学习day05

面向对象

面向过程与面向对象的区别

面向过程:侧重点流程,从头到尾一气呵成,牵一发而动全身,重构复杂。流水线式。

面向对象:模块化(类),抽离重复的部分。模块组合完成业务。上帝视角。

类和对象的区别

:类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性方法两个主要部分。打个比方person类


public class Person {
    //属性
	private String xxx;
	private int xx;
	//方法 (构造器)
	public Person(String xxx, int xx) {
		this.xxx = xx;
		this.xx = xx;
	}
    
    ......

}


对象:根据图纸构建出来的具体的事物。以person类实例化一个对象为例

Person person1 = new Person("dll",22);

person1这个对象就是以类Person为模板 加上具体的信息 所实例化的一个对象

类如何构建

类实现包括两个部分:类声明类体

类声明

[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}

其中,修饰符public,abstract,final说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。

类体

类体可以分为属性与方法

属性

private String name;//姓名
private int age; //年龄

方法

public void move() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在行动!");
	}
	public void study() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在学习!");
	}
	public void eat() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在吃饭!");
	}

综合代码

public class Person {
	private String name;
	private int age;
	public Person(){
        
    }
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

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

	public void move() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在行动!");
	}
	public void study() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在学习!");
	}
	public void eat() {
		System.out.println(this.getName() + "年龄:" + this.getAge() + "正在吃饭!");
	}
}


属性和行为的权限问题

访问修饰符

public:公共的,公开的

private:私有的,只能自己访问

//属性设为私有的 private
private String name;
private int age;
//	把方法设置为公开
public Person(String name, int age) {
	this.name = name;
	this.age = age;
}

public String getName() {
    return name;
}

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

public int getAge() {
    return age;
}

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

public void move() {
    System.out.println(this.getName() + "年龄:" + this.getAge() + "正在行动!");
}
public void study() {
    System.out.println(this.getName() + "年龄:" + this.getAge() + "正在学习!");
}
public void eat() {
    System.out.println(this.getName() + "年龄:" + this.getAge() + "正在吃饭!");
}

权限扩展

private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。

default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。

public:类中限定为public的成员,可以被所有的类访问。

this关键字

因为程序的就近原则,我们有时编写的代码如果遵循了见名知意的约定就容易出现以下比较尴尬的情况,自己赋值给自己:

private String name;
private int age; // 0

public void setAge(int age) {  //setAge(22)
    age = age;	// 22
}

上面代码setAge(22)运行,其实就只有一个age变量,我们类中的age并没有被赋值。

正确的写法,this关键字

为了避免这种情况的发生,Java语言提供了 this 关键字来区分类的变量(成员变量)和传入参数变量(局部变量)的区别。

this 表示当前正在运行的对象。

private String name;
private int age; // 22

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

构造器

  • 根据类创建了对象以后,会默认有一个无参的构造器
  • 如果自定义了构造器,则无参构造器会失效,按需改写
  • 构造器可以重载
// 无参构造器
权限修饰符 类名() {
    
}

// 有参构造器
权限修饰符 类名(参数1, 参数2) {
    
}
public Person(){
        
    }
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
Person person1 = new Person("dll",22);

打印所有属性 toString()

  @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

static

static:修饰成员变量和成员方法。
特点:被所有对象所共享(所有对象都可以调用该static变量/方法);
   可以使用类名调用与赋值(对于变量),可以直接使用类名调用(当然也可以采用对象调用);
   静态的加载优先于对象(可以再对象加载之前加载);
   随着类的加载而加载。

静态代码块:

随着类(当然,创建对象时会加载类)的加载而加载,只加载一次;用于加载类时做的初始化,

  • 特点:当第一次用到本类时,静态代码块执行唯一的一次
  • 静态内容总是优先于非静态,静态代码块比构造方法先执行。
  • 用来一次性的对静态成员变量进行赋值
public class StaticField {

	public static void main(String[] args) {
		Person one = new Person();
		Person two = new Person();
	}
	
}
public class Person {

	static {
		System.out.println("静态代码块执行...");
	}
	
	public Person() {
		System.out.println("构造方法执行");
	}
	
}

先执行。

  • 用来一次性的对静态成员变量进行赋值
public class StaticField {

	public static void main(String[] args) {
		Person one = new Person();
		Person two = new Person();
	}
	
}
public class Person {

	static {
		System.out.println("静态代码块执行...");
	}
	
	public Person() {
		System.out.println("构造方法执行");
	}
	
}

总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值