zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Java OOP 式编程

2023-04-18 14:50:53 时间

Java OOP编程

我们知道 OOP的三大特性分别是封装,继承,多态,接下来我就以几个简单的实例展示Java的面向对象的特性以及示例代码

一、封装

封装:顾名思义,即把你写的函数的功能给封装起来,别人只能使用它,却不知道功能是如何实现的,一个很简单的实例,看了你就懂了

(1)我们要打印一句话的时候就有输出函数:

System.out.println();

(2)每次我们打印的时候,都要输出这么一大段话,虽然有快捷键,但我还是觉的很麻烦,比如我在写一个项目的时候,我们需要添加一些用户的友好提示,就可以把这句话封装起来

public class Main(){
	public static info(String s){//这样就把这句话封装了起来,访问修饰符也可以使用private(不过这种情况经常会和其它方式结合在一起使用的比较多)
	System.out.println(s);
	}
	
	public static void main(String[] args) {
		info("Hello World");
	}

}

(3)这样就能给我们就很简单的实现了输出函数的封装

再来看另外一个实例,写一个类,然后在另一个类中打印一个学生的姓名,性别,年龄等信息

public class StudentData {
	private String name;
	private int age;
	private String gender;
	
	//然后按下alt+shift+s,选择Gatters和Settlers,系统会自动生成封装的类
	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 String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;

//还有另一种方式,这里的话, 你就不必再Test类中,一个个的的定义学生的信息参数了
//快捷键同上,找到Constructor using Fileds就可以,但是你要把三个参数的选项都勾上
	public StudentData(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	}
}

这里我们写好了学生信息的类

再写另一个测试类(Test)

public class Test {
	public static void main(String[] args) {
		//这里我把这Test类和StudentData类放在了同一目录下
		StudentData s=new StudentData();//创建我们封装好的类的对象
		s.setAge(18);//这里调用我们封装好的类的方法
		s.setName("Gorit");
		s.setGender("male");
//第二种方式,一步到位	StudentData s=new StudentData("Gorit", 18, "male");//创建我们封装好的类的对象
		
		//这是一种字符串处理方法,把我们想要打印的东西全都存放到str中
		String str="姓名:"+s.getName()+" 性别:"+s.getGender()+" 年龄:"+s.getAge();
		System.out.println(str);
	}
}

文章编辑于 2019年4月4日00:20:48

二、继承

多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需继承那个类即可

这个单独的类成为父类,基类或者超类:这多个类可以成为子类或派生类

现在给定一个父类(Father)和子类(Son) 写父类的属性和方法,父类现在有100元,和会踢足球的属性 再写子类,子类直接继承父类的属性和方法,再另外写一个打篮球的方法

(1)子类继承父类

父类:

public class Father {
	public int money=100;
	
	public void play() {
		System.out.println("踢足球");
	}
}

子类: 继承的关键字是extends

public class Son extends Father{
	
	public void myMonye(int money) {//这里孩子就继承了父类的属性和方法
//		System.out.println(money);
		System.out.println(super.money);//两种方法均可以调用
	}
	
	public void playBasketball() {//子类另外增加自己的方法
		System.out.println("打篮球");
	}
}

创建一个测试类 Test 如果

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Son s=new Son();//创建子类的对象
			System.out.println(s.money);//孩子继承父亲的money
			s.play();
			s.playBasketball();
	}
}
(2)方法的重写

当子类和父类中的方法的的参数,返回值,方法名完全一致时,在子类中写的方法如果有变动,就会覆盖父类的方法,这样就成为”方法重写“

Tips: 1、父类的私有方法不可以被重写 2、子类重写父类方法的时候,访问权限不能更低,比如父类是public,子类就不能是protected 3、父类为static静态方法,子类也必须按照static静态方法重写

这个比较简单,只要子类的的方法实现的参数,方法名,返回值类型和父类是一模一样的,就可以进行重写

示例: 父类

public class A {
	public int sum(int number1,int number2) {//这是我们写的父类的两数之和的方法
		return number1+number2;
	}
	
	public void poj() {
		System.out.println("我是父类方法1");
	}
}

子类:

public class B extends A{
	
	@Override//这个虽然是个注释,但是添加上别人就知道这是重写的方法
	public int sum(int number1,int number2) {
		return number1+number2+1;
	}
	public void poj2() {
		System.out.println("我是子类");
	}
}
(3)抽象类

抽象类:

无法使用static,private,final修饰 抽象类之中可以定义抽象方法和普通方法

给定一个炸弹鸟的抽象类

package pojo1;

public abstract class Brid {
//	public void attack() {
//		System.out.println("鸟会攻击");
//	}
	public abstract void attack();
	
	public void play() {
		
	}
	//普通方法必须有方法体
	//抽象方法可以没有方法提
}
package pojo1;

public class BoomBird extends Brid{

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("丢炸弹的鸟");
	}

}
package test;

import pojo1.BoomBird;
import pojo1.Brid;

public class BirdTest {
	public static void main(String[] args) {
		Brid b=new BoomBird();
		b.attack();
	} 
}

三、接口(补充)

接口的一些特征 1、接口是某个事物对外提供一些功能的声明 2、接口常常和多台使用在一起,也解决了java中单一继承的问题 3、接口的关键字是——interface 4、一般使用接口生命方法或常量,接口中的方法只能声明,不能具体实现

接口的实现: 格式:interface 接口名{} 类实现接口用 impements 实现 格式:class 类名 implements 接口名{}

示例: 这里我们写一个防盗门的样例 分析: 防盗门具有门的属性和防盗铃的属性

代码实现; 为了方便,这三个文件我放在同一个包的下面

public interface Call {//这是实现门铃的接口
	//报警
	public void call();

}
public interface Protecte {
	
	//保护的接口
	public void pro();

}
//门
public class Door  implements Protecte,Call {//这里就解决了无法多继承的问题

	@Override
	public void call() {
		// TODO Auto-generated method stub
	}
	@Override
	public void pro() {
		// TODO Auto-generated method stub
	}
}

接口还允许多继承

四、多态

(1)概念

多态可以这么理解,同一个事物在不同时刻展现出来的不同状态 也可以说是对外提供一个接口,通过不同的传递对象,出发的行为不一样 示例:

1、一只狗,狗可以有很多品种 2、一滴水,在不同时间,有不同的状态 3、猫是动物的一种

(2)多态的前提与体现

1、有继承的关系 2、有方法的重写 3、有父类引向子类

前面两点好说,第三点又是什么意思 比如给了A,B两个类,A为父类,B为子类

我们可以这么做 第一种:向上转型

父类 a=new 子类();

这样我们就可以通过a,调用父类的属性和行为,如果子类重写了父类的方法,那么调用的就是重写厚的方法

子类 b=(子类)a;

可以调用当前子类的所有行为