抽象类和接口以及final关键字

1.抽象类

概念:有一些事物,我们可以分析为类,但是相对比较抽象,不能直接实例化分析为具体的对象,此时我们可以将此类书写为抽象类。比如,动物,电脑,人.....

抽象类的规则:

   1.抽象方法使用abstract修饰 没有方法体

   2.抽象方法必须存在于抽象类中

   3.抽象类不能直接实例化 不能直接new对象 必须通过new子类的方式来实例化,向上转型的方式

   4.子类必须实现父类的抽象方法 除非子类也是抽象类

   5.子类可以选择是否重写父类的非抽象(普通)方法

   6.抽象类中可以有构造方法,是给子类使用的

   7.抽象类中也可以有普通的属性、普通的方法、静态方法,使用方式与之前相同

  抽象类也可以作为形参、返回值。。。用法与普通的继承一样

package com.qfedu.test2;
/**
 * 	本类是一个父类
 * 	属性:
 * 	品牌
 * 	行为:
 * 	开门
 * 	关门
 *
 */
public abstract class Door {
	private String brand;
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public Door(String brand) {
		this.brand = brand;
	}
	public Door() {
	}
	public abstract  void open();
	
	public abstract void close();	
}

 

package com.qfedu.test2;
/**
 * 	普通门
 * 	普通的开门关门方式
 *
 */
public class CommonDoor extends Door{
	
	public void open() {
		System.out.println("插入钥匙,门开了");
	}
	
	public void close() {
		System.out.println("手动关门");
	}

	public CommonDoor() {
		super();
	}

	public CommonDoor(String brand) {
		super(brand);
	}
	
}
package com.qfedu.test2;
/**
 * 防盗门
 */
public class SecurityDoor extends Door{

	@Override
	public void open() {
		System.out.println("指纹 + 密码解锁,门开了");
		
	}

	@Override
	public void close() {
		System.out.println("自动上锁,关门");
	}

	public SecurityDoor() {
	}

	public SecurityDoor(String brand) {
		super(brand);
	}

}
package com.qfedu.test2;
/**
 * 	人类 由人来操作门 
 * 	开门
 * 	关门
 *
 */
public class Person {
	/**
	 * 	多态实现方式1 父类作为形参 
	 * @param door
	 */
	public void openDoor(Door door) {
		System.out.println("回家了,开门");
		door.open();
	}
	
	/**
	 * 	多态实现方式1 父类作为形参 
	 * @param door
	 */
	public void closeDoor(Door door) {
		System.out.println("进入家中");
		door.close();
	}
	/**
	 * 	多态实现方式2 父类作为返回值
	 * @param money
	 * @return
	 */
	public   Door  buyDoor(int money){
		if(money > 10000) {
			return new SecurityDoor("大金刚");
		}else {
			return new CommonDoor("小金刚");
		}
	}
	public static void main(String[] args) {
		Person person = new Person();
		Door commonDoor = new CommonDoor("大钻石");
		person.openDoor(commonDoor);
		person.closeDoor(commonDoor);
		person.openDoor(new SecurityDoor("大金刚"));
		person.closeDoor(new SecurityDoor("大金刚"));
	}

}
package com.qfedu.test2;

public class Test {
	
	public static void main(String[] args) {
		Door common = new CommonDoor("钻石");
		common.open();
		common.close();
		System.out.println("======================");
		Door securityDoor = new SecurityDoor("大金刚");
		securityDoor.open();
		securityDoor.close();
	}
}

2.final关键字

修饰的内容:

1.属性,称之为常量

a:只有final修饰,就是常量,全部大写,必须在声明时赋值或者在构造方法中赋值(即在使用前必须有值啊),且只能赋值一次,因为值不可改变

b:static final修饰,表示静态常量必须在声明时赋值,或者在静态代码块中赋值(不可在构造方法中赋值,,static不依赖与对象啊)且只能赋值一次,因为值不可改变

小结:加上static的含义是在值不可改变的前提(final修饰了呀)下,同时表示这个常量在内存只存在一份。

2.方法,不能被重写,可继承

3.类,不能被继承

3.接口

接口:interface

特点:

JDK7

1.接口中不能定义普通属性,接口中的所有属性默认都是public static final 修饰的(静态常量),写不写都无所谓

2.接口中的方法 都是抽象方法默认都是public abstract修饰的(不能写普通方法、静态方法),写不写都是抽象方法

3.实现类(子类)必须重写接口的抽象方法,除非实现类是抽象类,或者是接口继承了此接口(接口只能继承接口)

4.接口不能直接new对象,不能直接实例化,必须通过new子类的方式实例化

JDK8 在原来JDK7的基础上增改

1.支持普通方法,使用default关键字修饰 加载访问权限之后,返回值之前。如:public default void m1()

2.支持静态方法

小知识:

接口与接口只能继承

抽象类不能继承接口,只能实现

接口不能继承不同类,而抽象类可以

抽象类与接口区别:

1.本质区别(适用场景):

当你关注一个事物的本质的时候,使用抽象类,当你关注一个功能的时候,使用接口

2.使用的区别

a:抽象类可以有普通属性,接口只有静态常量

b:抽象类可以有构造方法,接口不能有构造方法

c:抽象类可以有普通方法和静态方法,接口从JDK8开始才支持使用default关键字声明方法和静态方法

d:抽象类是extends继承,接口是implement实现

e:只能继承一个类,可以实现多个接口,接口可以继承多个接口

f:抽象类中抽象方法必须使用abstract修饰,接口默认都是public abstract修饰的

面试题: Java支持多继承码?

不支持,一个类只能有一个直接父类,但是可以通过接口继承多个接口的方式,实现类似多继承的效果,在能够满足需求的前提下,尽量使用接口

每日问题

1.请写出抽象类的所有特点

2.写出接口的所有特点,分别写明1.7和1.8

3.接口和抽象类的区别是什么?什么场景使用哪个?

4.手写冒泡排序 素材 int scores[]={89,56,45,78,12,3};

5.java中支持多继承吗?

6.静态常量的写法

7.this和super的区别

8.while循环和do–while的区别

9.switch支持的数据类型

10.面向对象的特征是什么?详细描述

11.==和equals的区别?

解答

1.请写出抽象类的所有特点

       1.抽象方法使用abstract修饰 没有方法体

       2.抽象方法必须存在于抽象类中

       3.抽象类不能直接实例化 不能直接new对象 必须通过new子类的方式 来实例化 ,向上 转型的方式

       4.子类必须实现父类的抽象方法 除非子类也是抽象类

       5.子类可以选择是否重写父类的非抽象(普通)方法

       6.抽象类中可以有构造方法,是给子类使用的

       7.抽象类中可以有普通的属性,普通的方法,静态方法,使用方式跟之前是一样的

2.写出接口的所有特点,分别写明1.7和1.8

JDK7

        1.接口中不能定义普通属性,接口中的所有属性默认都是 public static final 修饰的

        2.接口中的方法 都是抽象方法 默认都是 public abstract 修饰的(不能写普 通方法,不能写静态方法)

        3.实现类(子类)必须重写接口的抽象方法,除非实现类是抽象类,或者接口 继承接口

        4.接口不能直接new对象,不能直接实例化,必须通过new子类的方式实例 化

JDK8 在原来JDK7的基础上

         1.可以写普通方法,使用default关键字修饰 加载访问权限之后,返回值之 前

         2.也可以书写静态方法

3.接口和抽象类的区别是什么?什么场景使用哪个?

         a.抽象类可以有普通属性,接口只有静态常量

         b.抽象类可以有构造方法,接口不能有构造方法

         c.抽象类可以有普通方法和静态方法,接口只有JDK8开始才支持使用 default关键字声明方法和静态方法

         d.抽象类是extends继承,接口是implements实现

         e.只能继承一个类,可以实现多个接口,接口可以继承多个接口

         f.抽象类中方法必须使用abstract修饰,接口中默认都是public abstract修 饰的

   再加上适用场景(本质区别)

4.手写冒泡排序 素材 int scores[]={89,56,45,78,12,3};

        外层循环 n -1 内层循环 n - 1 - i

5.java中支持多继承吗?

         不。但是可以通过接口继承多个接口的方式,实现类似多继承的效果

6.静态常量的写法

         static final

7.this和super的区别

         this代表当前对象,super代表父类对象

          this可以访问属性,方法,构造方法,调用构造方法必须在构造方法的第一句

          super可以访问属性,方法,构造方法,调用构造方法必须在构造方法的第一句

8.while循环和do–while的区别

            while先判断后执行 do-while先执行后判断

9.switch支持的数据类型

           byte short int char 枚举 String

10.面向对象的特征是什么?详细描述

     (最好说出好处、优势)

          封装 属性私有 方法公开

          继承 子类extends父类 子类和父类是is - a 的关系

                 继承父类访问权限允许的属性和方 法 继承是java中实现代码重用的重要手段之一 简化,统一程序结构

          多态 父类作为形参 父类作为返回值 提高代码的可维护性 可扩展性

11.==和equals的区别?

 

posted on 2020-08-06 20:48  zitian246  阅读(176)  评论(0编辑  收藏  举报