面向对象编程

这篇博客详细介绍了面向对象编程的四个核心概念:封装、继承、多态和访问修饰符的权限。通过实例展示了如何使用这些概念,包括private属性的get/set方法、子类重写父类方法实现多态、以及构造方法的执行顺序。此外,还讨论了static、abstract和final关键字的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象编程


封装

将属性和方法封装到一个类中。

比如宠物类

public class Pet {
	private String name;
	private int health;
	private int love;
	int num;
	
	public void print(){
		System.out.println("宠物的名字是:"+name+",健康值:"+health+",亲密度:"+love);
	}
}

将属性添加private修饰,即只允许本类方法中使用
其他类如果需要访问。需要通过get/set方法访问。

public class Pet {
	private String name;
	private int health;
	private int love;
	int num;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getHealth() {
		return health;
	}
	public void setHealth(int health) {
		this.health = health;
	}
	public int getLove() {
		return love;
	}
	public void setLove(int love) {
		this.love = love;
	}
	public void print(){
		System.out.println("宠物的名字是:"+name+",健康值:"+health+",亲密度:"+love);
	}
}

而get方法是用来获取属性值,set方法使用来设置属性值。

可通过点击"Source"菜单,选择"Generate Getters and Setters…"来生成get/set方法

封装的目的:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问


继承

继承是代码重用的一种方式,将子类都有的属性和行为放到父类中

public class Dog extends Pet{
	private String strain;

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}
	public void print(){
		super.print();
	}
	public static void main(String[] args) {
		Dog dog = new Dog();
		dog.print();
	}
}

当创建Dog类时,也需要name属性、health属性、love属性时,就可以使用继承,这样Dog类中也拥有Pet类的属性和方法。

当然Dog类中也可以拥有自己的属性和方法。
当子类的方法与父类的方法重名时,即子类重写了父类的方法


多态

同一种事物,由于条件不同,产生的结果也不同

如何实现多态?
1:子类要重写父类的方法
2: 父类类型作为形参类型
3: 实参传递子类的类型

public abstract class Pet {
	protected String name;
	protected int health;
	protected int love;
	public abstract void toHosiptal();
}
public class Dog extends Pet{
	private String strain;
	public void toHosiptal() {
		this.health += 60;
	}
}
public final class Penguin extends Pet{
	private String sex;
	public void toHosiptal() {
		this.health += 40;
	}
}
public class Master {
	public void Cure(Pet pet){
		pet.toHosiptal();
	}
	public static void main(String[] args) {
		Dog dog = new Dog();
		dog.health = 20;
		Penguin pen = new Penguin();
		pen.health = 30;
		Master mester = new Master();
		mester.Cure(dog);
		mester.Cure(pen);
	}

}

如上面4个类,分别是Pet类,Dog类,Penguin 类,Master类
其中Pet类中有抽象方法toHosiptal(),如果父类中存在抽象方法,子类必须重写这个抽象方法,所有Dog类和Penguin 类中也有toHosiptal()方法,并且有方法体。Dog类的方法体为:this.health += 60;Penguin类的方法体为:this.health += 40;,则表示不同宠物去医院一次Health值回复的不一致。

而在Master类中,有个Cure()方法,形参为Pet类对象。而在main方法中,可以看出传到Cure()方法的实参是Dog类和Penguin 类。

而程序并没有报错。运行的结果也是根据传入相应的对象,而执行相应类的方法,这就是多态。

根据不同事物的而实现不同的方法,尽管方法名相同,但是执行结果不一致,不同事物展示出得多种形态。

修饰符的访问权限。

修饰符publicprotecteddefaultprivate
同类
同包×
子类××
不同包×××

由此可见四种修饰符的权限排行:public > protected > default>private


static

即静态,

当static修饰属性,属性不再可被实例化对象调用。但是可以直接用类名调用

当static修饰方法,方法不再可被实例化对象调用。但是可以直接用类名调用

当static不能修饰类。

static {}为静态代码块,放置在里面的方法可以在加载后直接运行。主要是完成一些静态变量或静态常量的初始化工作。

在方法中不能定义static变量

不能在静态方法中引用非静态的属性和方法。可以在非静态方法中引用静态的方法和属性


abstract

即抽象

当abstract修饰类,该类为抽象类,不可被实例化

当abstract修饰方法,该方法为抽象方法,不能有方法体,而且修饰符必须时public 或者 protected,因为抽象方法没有方法体,所有必须要依赖子类重写。所有权限必须时public或protected,

如果子类也是抽象类,则不用重写父类的抽象方法。当子类也为抽象类时,就也无法实例化,故无法调用自身方法,所有不用重写


final

即最终

当final修饰属性,属性值不能被更改

当final修饰方法,方法不能被重写

当final修饰类时,类不能被继承

当final修饰引用类型时,不能再次被初始化(new)

final和abstract不能同时修饰类

实例化方法的执行顺序

按照之上的Master 类中实例化Dog方法,

首先执行父类的静态属性,然后执行子类的静态属性,再执行子类的构造方法,会隐式的调用父类的构造方法,然后执行父类的属性,继而执行子类的构造方法,执行子类的属性

父类的静态属性 —> 父类的静态代码块 —> 子类的静态属性 —> 子类的静态代码块 —> 父类的构造方法 —> 父类的属性 —> 子类的构造方法 —> 子类的属性

this和super

this:就是本类的意思
super:就是父类的意思。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值