java抽象类 和接口

1.抽象类

在这里插入图片描述


public abstract  class People {

	private String name;
	private int age;
	private String sex;
	private final int a = 20;
	
	public abstract void eat();
	
	public abstract void work();
	
	public abstract void a();
	
	public abstract void b();
	
	public abstract void c();
	
	public abstract void d();
	
	public abstract void e();
	
	public abstract void f();
	
	public abstract void g();
	
	public void sleep(){
		System.out.println("睡觉");
	}
	
	
	
	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 getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public People(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public People() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	

}
public abstract  class Student extends People {
	
	public Student() {
		//super();
		
	}

	public static void main(String[] args) {
		//People p1 = new Student();
	
	}

	@Override
	public void eat() {
		System.out.println("学生吃肉");
	}

	@Override
	public void work() {
		System.out.println("学习");
	}

	
	
	
}
public abstract class Teacher extends People {

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

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

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

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

	
	
}


public abstract class Doctor extends People {

	@Override
	public void eat() {
		// TODO Auto-generated method stub

	}

	@Override
	public void work() {
		// TODO Auto-generated method stub

	}

	@Override
	public void a() {
		// TODO Auto-generated method stub

	}

	@Override
	public void b() {
		// TODO Auto-generated method stub

	}

	@Override
	public void c() {
		// TODO Auto-generated method stub

	}

	@Override
	public void d() {
		// TODO Auto-generated method stub

	}

	@Override
	public void e() {
		// TODO Auto-generated method stub

	}

	@Override
	public void f() {
		// TODO Auto-generated method stub

	}

	@Override
	public void g() {
		// TODO Auto-generated method stub

	}

}

public class Test {
	
	/*
	 * 抽象类的学习
	 * 
	 * 抽象类:把子类中那些具有共同属性以及共同行为的特性,归纳,总结出一个父类,我们把这个父类,称为抽象类
	 * 虽然我们口头上称这种类为抽象类,但是java语法结构上并没有体现出这种抽象的概念
	 * 那么怎么让一个类变为抽象类?
	 * 
	 * 1:给类加关键字:abstract
	 *    语法格式
	 *    public abstract class 类名{
	 *    
	 *    }
	 * 2:如果一个类中有抽象方法,那么这个类一定是抽象类
	 *   抽象方法 语法格式:抽象方法只有方法声明,没有方法体。
	 *    修饰符  abstract 返回值  方法名();
	 *    
	 * 3:如果一个类继承了抽象类
	 *     那么这个类 
	 *     1:要么重写父类中所有抽象方法   
	 *     2:要么自己变成抽象类
	 *     
	 *  抽象类的作用?
	 *   1:减少了抽象类中方法体的写法,提高了部分效率
	 *   2:规定了一个类必须做什么,约束了子类的行为,大大的增强了类的范围性,使得一个类在设计的时候,不是那么的随意
	 *     但是正因为类的规范性,使得类与类之间的耦合关系大大增加,无形之中给子类增加了负担
	 *     
	 *  抽象类的细节处理
	 *   1:抽象类是否有变量:有
	 *   2:抽象类是否有常量:有
	 *   3:抽象类是否有抽象方法
	 *        3.1 抽象类中可以没有抽象方法,也可以有
	 *        3.2 有抽象方法的类,必须是抽象类
	 *   4:抽象类是否有成员方法:有
	 *   5:抽象类是否有构造方法:有
	 *   6:抽象类是否可以创建对象:不可以创建对象
	 *   7:每个类至少会提供一个构造方法
	 *      7.1:向上引用,调用父类的构造方法    
	 *      7.2:初始化属性值
	 *   8:抽象类就是为了被继承的,如果没有子类继承,抽象类没有任何作用
	 *   9:所以多态的特性,在抽象类最能体现出来,因为多态的前提是继承
	 *     
	 *     
	 * 
	 */
	public static void main(String[] args) {
		
		//People p = new People();
		//People p = new Student();  //多态  向上转型
		
	}

}

2.接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


public abstract class People {
	
	private String name;
	private int age;
	private String sex;
	
	public abstract void eat();
	
	public void sleep(){
		System.out.println("躺着睡");
	}
	
	public abstract void work();
	
	
	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 getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public People(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public People() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	

}


public class Student extends People {

	@Override
	public void eat() {
		System.out.println("学生吃肉");
	}

	@Override
	public void work() {
		System.out.println("学JAVA");
	}
	
	public void playGame(){
		System.out.println("LOL");
	}
	
	

}


public class Teacher extends People {

	@Override
	public void eat() {
		System.out.println("老师吃菜");
	}

	@Override
	public void work() {
		System.out.println("教JAVA");
	}
	
	public void running(){
		System.out.println("跑步");
	}

}


public interface SmokeInter {
	
	
	//抽烟行为
	void smoking();

}

public class SmokeStudent extends Student implements SmokeInter{

	@Override
	public void smoking() {
	   System.out.println("学生抽烟");
	}

}
public class SmokeTeacher extends Teacher implements SmokeInter {

	@Override
	public void smoking() {
	  System.out.println("老师抽烟");
	}

}
public class Test {
	
	/*
	 * 父类:People
	 *    1个实现的方法:sleep()
	 *    2个抽象的方法:eat()  work()
	 * 子类1:Student
	 *    继承父类的方法:sleep()
	 *    重写父类的方法:eat()  work()
	 *    自己的方法:playGame()
	 * 子类2:Teacher
	 *    继承父类的方法:sleep()
	 *    重写父类的方法:eat()  work()
	 *    自己的方法:running() 
	 * 接口:SmokeInter  抽烟接口
	 * 
	 *  实现类1:SmokeStudent  extends Student implements SmokeInter
	 *  
	 *  实现类2:SmokeTeacher  extends Teacher implements SmokeInter
	 *          
	 *    
	 *  新的需求:需要加一个抽烟的方法,问题是这个方法应该定义在哪个类中?
	 *  问题1:抽烟是一个行为,它并不属于任何一个类
	 *  解决方法:把抽烟这个行为,定义在抽烟的接口中
	 * 
	 *  接口:USB接口,可以连接电脑和键盘,接口起到了一个桥梁作用
	 *    类:电脑类和键盘类
	 *    如何让电脑和键盘产生联系
	 *    1:继承方案
	 *      继承会是两个2类产生耦合关系
	 *    2:接口方案
	 *       电脑通过一个接口把键盘联系起来,用的时候插上,不用的时候拔掉,起到一个即插即用的功能
	 *     接口是类与类之间一个桥梁,起到了一个联通的作用,既不产生耦合关系,而且功能越来越强大
	 *     一个类可以连接多个接口,突破了一个类原本的类型限制,使得整个类的功能很丰富    
	 *     
	 *   接口的语法格式:
	 *   interface
	 *   
	 *   修饰符 interface 接口名(){
	 *     ...
	 *   }
	 *   
	 *   如何让一个类实现接口
	 *     修饰符  class 类名 implements 接口名{
	 *    
	 *     }
	 *     
	 *   全栈工程师 
	 */
	public static void main(String[] args) {
		
		//创建一个抽烟的学生对象
		People stu1 = new SmokeStudent();
		People p = new SmokeTeacher();
		People p1 = new Student();
		People p2 = new Teacher();
	
		//优点:可以接受不同类型的对象
		//缺点:多态不能调用子类独有的方法
		System.out.println("---普通人类---");
		stu1.eat();
		stu1.sleep();
		stu1.work();

		Student stu2 = new SmokeStudent();
		
		System.out.println("---普通学生---");
		stu2.eat();
		stu2.sleep();
		stu2.work();
		stu2.playGame();
		
		SmokeStudent stu3 = new SmokeStudent();
		//优点:既能调用继承父类的方法,也能调用自己独有的方法,功能强大
		//缺点:类型单一,如果把真个类型作为方法的形参的话,功能单一
		
		System.out.println("-----抽烟的学生-------");
		stu3.eat();
		stu3.sleep();
		stu3.work();
		stu3.playGame();
		stu3.smoking();
		
	}

}		
		


```
public class Test {
	
	/*
	 * 接口和实现类起名规则
	 * 
	 * 例如: 接口名称:StudentDao,StudentService
	 *       实现类:StudentDaoImpl,StudentServiceImpl
	 * 
	 */

}

```

```

public interface TestInter {
	/*
	 * 接口的内部结构
	 * 
	 * 1:接口是否有变量:没有
	 * 2:接口是否有常量:有
	 *    默认修饰符  public static final
	 * 3:接口是否有实现方法:没有 
	 *   注意 jdk1.8之前没有
	 *   1.8之后有了,静态实现方法,默认方法
	 * 4:接口是否有抽象方法:有
	 *   默认修饰符  public abstract 返回值  方法名();
	 * 5:接口是否有构造方法:没有
	 *   接口不是类,所以也就没有必要写构造器
	 *   
	 *   抽象类是为了被继承的
	 *   接口是为了被实现的
	 */
	
	  int a = 10;
	
	final int b = 20;
	
	
	/*
	default void ss(){
		
	}
	*/
	 void s();
	
}	



                3.抽象类与接口


public interface A extends D,E {

}

public abstract class B extends C implements A,D{

}

public class C{

}
public interface D {
	
	public void show();
	public void main(String[] args) ;

}

public interface E {

	//public abstract void show();
}

```

```
public class Test {
	
	/*
	 * 接口的用法
	 * A:接口
	 * B实现类,C实现类
	 * 
	 * A a = new B();
	 * 等号左边是接口类型,右边是实现类的对象 
	 * 多态的重要体现形式:向上转型
	 * 
	 * 实际开发中,方法的形参是接口类型,实际上需要我们传入一个实现类对象
	 * 实际开发中,方法的形参是抽象类,实际上需要我们传入一个子类对象
	 * 
	 * 面向接口编程:有利于大型项目的的可扩展和可维护性
	 * 
	 * 类与类的关系
	 *   继承,单继承,但是有继承链
	 * 类与接口的关系
	 *   实现关系,多实现
	 * 接口和接口的关系
	 *   继承关系,多继承
	 * java的的最基本的2大组织结构:类与接口  
	 * 接口把方法定义好,等着实现类来实现
	 * 实际开发,先定义接口,在写具体的实现类
	 * 注意:一个类既能继承父类,还能实现接口,但是必须先继承,后实现
	 *   
	 * 
	 * 面试题:接口和抽象类的区别?
	 * 1:方法实现
	 *   抽象类可以有实现方法
	 *   接口没有,1.8之后有了,可以有静态方法,默认方法
	 * 2:实现方式
	 *    抽象类是extends继承的
	 *    接口是implements实现的
	 * 3 构造器 
	 * 	    抽象类可以有构造器 
	 *   接口不能有构造器
	 * 4:方法修饰符
	 *   抽象类的抽象方法可以有public、protected和default这些修饰符 
	 *   接口方法默认修饰符是public。你不可以使用其它修饰符。      
	 * 5:继承
	 *   抽象类的抽象方法可以继承一个类和实现多个接口
	 *   接口可以继承一个或多个其它接口
	 *   
	 * 什么时候使用抽象类和接口?
	 *    具体类  is..a 抽象类   是什么   类的说法
	 *    抽烟的学生是学生
	 *    狗是一个动物
	 *    
	 *    ..like..a.. 像什么
	 *    如果你的类的功能,是由很多不同之间的功能组合而成,那么应该使用接口多实现的方式
	 *    
	 *   
	 *    定义一个抽象类 Animal  3个方法 吃饭  睡觉 工作
	 *    2个子类:Dog,Cat
	 *    定义2个接口  狗要钻火圈,猫要算算数
	 *    定义2个子类  钻火圈的狗,算算术的猫
	 *    
	 * 
	 */
	
	
	public void show(A a){
		
	}
	
	public static void main(String[] args) {
		//A a = new A();
		//A a = new B();
		//A a1 = new C(); //面向接口编程
		
		//B b1 = new B(); //面向对象编程
		//Test t = new Test();
		//t.show(a);
		//t.show(a1);
		
		//System.out.println(a);
		
	}

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值