欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java OPP

程序员文章站 2022-03-16 09:08:37
...

Java OPP

一、对象和封装

1、回顾:

1.包名取名规则:字母小写,不能是数字开头

2.类名取名规则:不能是数字开头,首字母大写

2、使用面向对象进行编程设计

面向对象就是抽取过程,可分为三步:

  1. 发现类
  2. 发现类的属性
  3. 发现类的方法

抽象时原则有:

  • 属性和方法的设置是发了解决业务问题
  • 关注主要属性和方法
  • 如没有必要,勿增加额外的类,属性与方法。

遵循以上规则,代码如下:

/*
*宠物狗狗类
*/

public class Dog {
	String name = "无名氏"; //昵称,默认值是"无名氏"
	int health = 100;	//健康值,默认值是100
	int love = 0;	//亲密度
	String strain = "聪明的拉布拉多犬"; //品种
    
    //输出狗狗信息
	public void print() {
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我是一只"+this.strain);
	}
}
public class Penguin {
	String name = "无名氏"; 
	int health = 100;
	int love = 0;
	String sex = "Q仔";
	public void print() {
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",性别是"+this.sex);
	}
}

在以上代码中可以知道如下步骤:

  • 根据控制台提示输入宠物的类型,昵称等内容。
  • 根据输入的内容创建相应的宠物对象。
  • 输出宠物信息,表示领养成功。
public class Test {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("欢迎来到宠物店");
        //1、输入宠物名称
		System.out.println("请输入要领养的宠物名字:");
		String name = input.next();
        
        //2、选择宠物类型
		System.out.println("请输入要领养的宠物类型:(1、狗狗,2、企鹅)");
		switch (input.nextInt()) {
		case 1:
			System.out.println("请选择狗狗的品种:(1、聪明的拉布拉多犬,2、酷酷的雪纳瑞犬)");
			String strain = null;
			if (input.nextInt()==1) {
				strain = "聪明的拉布拉多犬";
			}else {
				strain = "酷酷的雪纳瑞犬";
			}
			Dog dog = new Dog();
			dog.name = name;
			dog.strain = strain;
			dog.print();
			break;
		case 2:
			System.out.println("请选择企鹅的性别:(1、Q仔,2、Q妹)");
			String sex = null;
			if (input.nextInt()==1) {
				sex = "Q仔";
			}else {
				sex = "Q妹";
			}
			Penguin pgn = new Penguin();
			pgn.name = name;
			pgn.sex=sex;
			pgn.print();
			break;

		}
	}

}

根据以上,Java中创建对象,调用属性及方法的语法和C#中的相同的:

  • 通过构造方法来创建对象,如"Penguin p = new Penguiin();"。
  • 通过对象名.属性名的方式调用属性,如"p.name = “qq”;"。
  • 通过对象名.方法名的方式调用方法。如"p.print();"。

3、常量:

final:常量修饰符,常量是不可以被修改的,只能赋值一次。

如下代码:

public class Penguin {
	String name = "无名氏";
	int health = 100;
	int love = 0;
	final String SEX_MALE = "雄";
	final String SEX_FEMALE = "雌";
	String sex = SEX_MALE;
	public void print() {
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",性别是"+this.sex);
	}
}

规范:类名、属性名、方法名及常量名的命名规范如下:

  • 类名由一个或几个单词组成,每个单词的第一个字母大写,如Dog、StringBuffer。
  • 属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写。
  • 常量由一个或多个单词组成,所有字母大写,如PI、SEX_MALE。

4、构造方法及其重载

Java中的与C#中的构造函数一样,通过无参或参数的构造方法(Constructor)完成赋值的初始化工作。

public class Penguin {
	String name = "无名氏";
	int health = 100;
	int love = 0;
	String sex = "Q仔";
    //无参构造方法
	public Penguin()
	{
		name="楠楠";
		love = 20;
		sex="Q妹";
		System.out.println("执行构造方法");
	}
	public void print() {
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",性别是"+this.sex);
	}
}

在这段代码中,Penguin()方法是Penguin类的构造方法,当在main方法里执行 new Penguin()对象时,默认会输出无参构造函数中的代码。

5、方法重载与继承

方法重载的判断如下:

  • 必须在同一个类里
  • 方法名相同
  • 参数列表(方法参数的个数或参数类型)不同
  • 与方法换回值和方法修饰符没有任何关系

在使用this调用自身或super调用父类的其他构造函数时,只能作为第一语句。

6、封装:

类的三大特性:

封装:具体私有化

继承:子承父

多态:一个事物多种形态

**封装:**面向对象的三特性之一,就是将类的状态信息隐藏在类部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。

**封装具体步骤:**修改属性的可见性来限制对属性的访问,每个属性创建一对赋值方法和取值方法,用于对这些属性的存取,在赋值方法中,加入对属性的存取控制语句。

**封装的好处:**隐藏类的实现细节,让使用者只能通过程序规定的方法来访问数据,可以方便地加入存取控制语句,限制不合理操作。

二、继承与多态:

1、继承

继承的定义:

  • 子承父,将具有相同行为的类的代码提取为公共类
  • 所有描述两个类之间的联系
  • 子类/派生类:继承的类
  • 父类/基类:被继承的类
//语法
//修饰符 SubClass extends SuperClass{
	//类定义部分
}

继承通过extends关键字来实现,其中的SubClass称为子类,SuperClass称为父类、基类或超类,修饰符如果是public,则该类在整个项目中可见,若无public修饰符,则该类只能在当前包可见,不可以使用private和protected修饰类。

public class Pet {
	private String name = "无名氏";
	private int health = 100;
	private int love = 0;
	/**
	*无参构造方法
	*/
	public Pet() {
		this.health = 95;
		System.out.println("执行宠物的无参构造函数!");
	}
    /**
	*有参构造方法
	*/
	public Pet(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public int getHealth() {
		return health;
	}
	public int getLove() {
		return love;
	}
    /**
	*输出宠物信息
	*/
	public void print() {
		System.out.println("宠物的*:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+"。");
	}
}


	/**
	*狗狗类,宠物的子类
	*/
public class Dog extends Pet {
	private String strain; //品种
	
	public Dog(String name,String strain) {
		super(name);//此处不能使用this.name = name;
		this.strain = strain;
	}
	public String getStrain() {
		return strain;
	}
}


	/**
	*狗狗类,宠物的子类
	*/
public class Penguin extends Pet {
	private String sex;//性别
	public Penguin(String name,String sex) {
		super(name);
		this.sex = sex;
	}
	public String getSex() {
		return sex;
	}
}

继承是面向对象的三大特性之一,是java中实现代码重用的重要手段之一。

1.1、访问访问修饰符

  • 继承public和protected修饰的属性和方法,无论子类和父类是否同一个包里。
  • 继承默认权限修饰符的属性和方法,但子类和父类必须在同一个包中。
  • 无法继承private修饰的属性和方法。
  • 无法继承父类方法
访问修饰符 本类 同包 子类 其他
private turn
默认 turn turn
protected turn turn turn
public turn turn turn turn

2、多态

2.1、重写父类方法

  1. 相同的方法名
  2. 相同的参数列表
  3. 子类不能缩小父类被重写方法的访问权限
  4. 父类的返回值类型>=子类的返回值类型
  5. 抛出异常:父类>=子类。
public class Father{
    public void SayHi(){
        System.out.println("这里是Father父类!");
	}
}
public class son extends Father{
    @Override
    public void SayHi(){
        System.out.println("这里是son子类!");
	}
}

2.3、instanceof运算符

语法:

//对象 instanceof 类或接口

用于判断对象是否属于用一个类

三、接口

1、语法

访问修饰符  interface 接口名 extends 父接口1,父接口2{
    //常量定义
    //方法定义
}

class 类名 extends 父类名 implements 接口1,接口2{
    //类成员
}

2、接口的特点:

一个类只能有一个直接父类,但可以通过implements实现多个接口。当类在继承父类的同时又实现了多个接口时,extends关键字必须位于implement关键字之前。

3、接口说明:

  • 接口中的属性都是全局静态常量,接口中的方法都是全局抽象方法。
  • 类只能继承一个父类,但可以实现多个接口。一个类如果实现一个接口,则必须实现接口中的全部方法,否则必须将其定义为抽象类。Java通过实现接口达到多重继承效果。
  • 接口表示一种约定,接口也表示一种能力,接口体现了约定和实现分离的原则。
相关标签: C#语言