折纸的不归路(11)

一.修饰词

final

最终的,组后的,不可修改的
可以修饰什么东西?
修饰类:不允许被继承,该类的功能不再支持扩展
修饰变量:相当于一个常量,在声明阶段要给予初始值
修饰方法:该方法不可以被子类重写

abstract

抽象的
抽象方法:没有方法体的方法叫做抽象方法
public void show();
在方法前面用abstract修饰方法,则该方法为抽象方法,并且没有方法的具体实现

接口(interface)

用来定义规范的
架构师—>告诉你模块中有哪些功能,具体的实现要靠程序员来完成

在person中刚给一个接口
void cutBy(Knife k);

学生管理系统
老师 学生 超管
学生:登录,查看信息
StudentService
public vooid login (String usnm,String pwd);
public Studeng selectSelfInfo(int sno);
老师:登录,查看学生信息(列表)
TeacherService
public vooid login (String usnm,String pwd);
超管:登录,管理用户(增删改查)
AdminService
adduser();
removeUser();
updateUser();
selectUser();
selectUser(String name);

一些语言,类似于c++,支持多继承
鱼,既是动物,也是食物,同时具备两个类的特征

class Fish extends Animal,Food{
		eat();
	}

Animal {
		run();
		eat(){} //主动吃什么的方法
	}
	Food {
		do();
		eat(){}
	}
	

abstract测试

package com.briup.day09;
public class AbstractTest {
	public static void main(String[] args) {
		//A a = new A();
		A b = new B();
		b.show();
		b.destroy();
		b.display();
		C c = new D();
		c.destroy();
	}
}
abstract class A{
	final int i = 0;
	static String s;
	//展示
	public abstract void show(); 
	//销毁
	public abstract void destroy();
	public A() {
	}
	public void display() {
		System.out.println("这是抽象类中的非抽象方法");
	}
}
class B extends A{
	//子类B继承抽象类A,必须实现A中的所有抽象方法
	//子类B可以选择性的重写B中的非抽象方法
	@Override
	public void show() {
		System.out.println("B show");
	}
	@Override
	public void destroy() {
		System.out.println("B destory");
	}
	@Override
	public void display() {
		//这个方法在A中具有方法体,所以可以选择性重写
		//可以添加功能,可以覆盖
		super.display();
		System.out.println("新添功能");
	}
}
abstract class C extends A{
	public abstract void hah();
	public abstract void hei();
	@Override
	public void destroy() {
		System.out.println("C destory");
	}
}
class D extends C{
	@Override
	public void hah() {
		// TODO Auto-generated method stub
	}
	@Override
	public void hei() {
		// TODO Auto-generated method stub
	}
	@Override
	public void show() {
		// TODO Auto-generated method stub
	}
}

抽象类的应用

先创建一个形状的抽象类

package day10;
/**
 * 图形的抽象类
 * 抽象类失去了new对象的权利
 * 抽象类获得了可以定义抽象方法的权利
 * @author Acer
 *
 */
public abstract class Shaape {
	private String color;//图形的颜色
	//定义两个构造器
	//空参
	public Shaape() {
	}
	//全参
	public Shaape(String color) {
		this.color = color;
	}
	//用来计算周长
	public abstract double getPerimeter();
	//用来返回对应的图形类型
	public abstract String getType();
	//get和set方法
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}	
}

然后分别创建三角形类和圆形类,都继承自形状类

package day10;
//三角形
public class Triangle extends Shaape {
	// 三边
	private double a;
	private double b;
	private double c;
	// 两个构造器
	// 空参
	public Triangle() {
	}
	// 全参
	public Triangle(double a, double b, double c, String color) {
		super(color);
		this.a = a;
		this.b = b;
		this.c = c;
	}
	// 直接提供一个三边输入的方法
	public void setSides(double a,double b,double c) {
		if(a>=b+c || b>=a+c || c>=a+b) {
			System.out.println("两边之和必须大于第三边");
			return;
		}
	}
	@Override//重写父类中的抽象方法
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return a+b+c;
	}

	@Override
	public String getType() {
		// TODO Auto-generated method stub
		return getColor() + "三角形";
	}
}
package day10;
import static java.lang.Math.*;//导包时导入.Math.*,在使用PI时可以直接调用值,不需要方法名
//圆形类
public class Circle extends Shaape{
	//	半径
	private double radius;
	//无参
	public Circle() {
		super();
	}
	//全参
	public Circle(double radius, String color) {
		super(color);
		this.radius = radius;
	}
	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return radius*2*PI;
	}
	@Override
	public String getType() {
		// TODO Auto-generated method stub
		return getColor()+"圆形";
	}
	@Override
	public String toString() {
		return "Circle [radius=" + radius + "]";
	}
}

然后建立一个测试类来测试相关内容

package day10;

public class ShapeTest {
	public static void main(String[] args) {
		//三角形
		Shaape s1 = new Triangle(3,4,5,"红色");
		System.out.println(s1.getPerimeter());
		System.out.println(s1.getType());
		System.out.println(s1.getType()+"的周长为"+s1.getPerimeter());
		//圆形
		Shaape s2 = new Circle(10,"黄色");
		System.out.println(s2.getPerimeter());
		System.out.println(s2.getType());
		System.out.println(s2.getType()+"的周长为"+s2.getPerimeter());
	}
}

接口和抽象类的相同和不同

相同点

1.都能够定义抽象方法
2.都不能被实例化
抽象类要靠其子类实例化
接口都要靠实现类来实现,接口可以听过匿名内部类的形式来临时new一下

不同点

抽象类只能继承一个,接口可以实现多个
抽象类中可以提供方法的实现,避免子类复杂
接口中一般只提供抽象方法。

访问控制修饰符

public
protected
private
默认:不写
权限分为几类:同类、同包不同类、子父类、不同包
包装类:
对基本数据类型包装成为引用数据类型
为什么要包装
java中变成单元是类—>引用类型
如何用引用类型来包装

二.心得

今天学的东西,接受起来还可以,没有昨天那么吃力,所以今天的大部分时间还是用来看多态的相关内容了.大体上有了更深一步的认识,但是感觉还是不够,明天下午刚好有活动课,利用活动课的时间再次深入看看多态的相关内容把.

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页