继承的概念
继承是面向对象的第二大特征。
继承是从已有的类派生出一个新类,叫子类,子类可以继承父类非私有化的方法。
语法格式:
class 类名(子类) extends(子类) 类名{
}
继承的实现代码
class Father{
//成员属性
//成员方法
}
class Son extends Father{
//成员属性
//成员方法
}
重写
重写定义:在一个子类中有与父类相同的方法名和参数方法,该方法叫做重写。
目的:父类的需求满足不了子类的需求,这个时候子类就要重写父类非私有话的方法。
重写用关键字Overidde
重写的实现代码:
class Father{
//成员属性
public void eat(){
System.out.println("吃肉");
}
}
class Son extends Father{
//成员属性
//重写
@Override
public void eat() {
System.out.println("我吃面条");
}
}
注意:只能重写父类非私有话的方法。
重载
重载定义:在一个类中有很多方法,方法名一样,参数不一样,我们称为重载。
代码实现:
package com.qfedu.d_override;
class Person {
//在一个类中,方法法名字一样,但是参数一定不一样。这叫方法的重载
//返回值可以不一样
public void test () {
System.out.println("test");
}
public void test (String name) {
System.out.println(name);
}
public void test (int i) {
System.out.println(i);
}
void test (double d1) {
}
public String test(String str1, String str2) {
return str1 + str2;
}
}
public class Demo3 {
public static void main(String[] args) {
}
}
总结:
1.方法的重载必须在同一个类中
2.方法名字必须一致
3.方法的参数类型必须不一样
4.方法的返回值可以不一样
5.无参构造和有参构造 也是一种重载
super关键字
只能用于继承,并在子类中使用。代表的是父类对象。
super用法:
1.可以调用父类中的属性和方法
2.可以调用父类的构造方法
入门案例:
package com.qfedu.b_super;
class Father1 {
String name;
public Father1 () {
System.out.println("Father1的无参构造");
}
public Father1 (String name) {
System.out.println("Father1有参构造");
}
}
class Son1 extends Father1 {
//在子类中无论你写了有参构造和无参构造,都要去执行父类的无参构造
//除非你自己调用父类有参构造方法
public Son1(String name) {
//在调用父类的无参构造方法
//super();
super("狗蛋");
}
}
public class Demo2 {
public static void main(String[] args) {
Son1 son1 = new Son1("狗蛋");
}
}
抽象类
如果一个类中没有足够的信息来描述具体的对象,那么这个类叫抽象类。
用关键字abstract修饰
abstract关键字
abstract修饰的类叫抽象类
abstract修饰的方法叫抽象方法
语法格式:
abstarct class 类名{
普通的方法;
public void eat () {
}
抽象方法;
public abstarct void sleep ();
}
入门案例:
package com.ymk.csdn;
abstract class Person{
//普通成员方法
public void eat(){
System.out.println("吃什么");
}
//抽象方法
abstract public void play();
}
class Student extends Person{
@Override
public void play() {
System.out.println("踢足球,跑步");
}
}
在上述代码中,我们定义了一个抽象类,抽象类里有两个方法,普通成员方法和抽象方法,由于抽象方法不能实例化,抽象方法也没有方法体,是个不完整的方法,所以我们只能通过一个普通的类去继承它,并且在子类中去重写所有的抽象方法。
总结:
1.如果一个类中有abstract修饰,那么这个类就是抽象类
2.抽象类中可以有普通抽象方法和抽象方法
3.抽象方法没有方法体,是 不完整的方法
4.抽象类不能实例化
5.创建一个普通类继承抽象类
6.在子类中去重写抽象类中所有的抽象方法
7.非抽象方法可以重写也可以不重写
8.抽象类可以继承另一个抽象类
9.抽象类可以继承非抽象类
final关键字
用法:
1.final可以修饰成员变量
使用final修饰的成员变量,一定要赋值(初始化)。而且不能修改。
2.final可以修饰局部变量
使用final修饰局部变量的时候,可以先对变量不赋值,使用之前进行赋值。
但是一旦赋值以后就无法更改。
3.final可以修饰成员方法
final修饰的成员方法不能被重写,牵涉到继承
4.final可以修饰一个类
final修饰的类不能被继承
5.final可以修饰对象的引用
修饰对象引用 一旦被赋值 就无法改变
代码实现:
class Person {
final String name = "狗蛋";
public void test () {
final int i;
i = 30;
//i = 80;//一旦被赋值,就无法改变了
System.out.println(i);
}
public final void eat () {
System.out.println("吃饭");
}
}
//class Man extends Person {
// @Override
// public void eat() {
// System.out.println("吃的多");
// }
//}
public class Demo1 {
public static void main(String[] args) {
final Person person = new Person();
System.out.println("Person:" + person);
//一旦使用final修饰person 对象引用 是一个固定的内存地址
Person person1 = new Person();
System.out.println("Person1:"+ person1);
//person.name = "嘻嘻";
//person = person1;//将person1赋值给了person对象
System.out.println(person);
}
}
接口
语法格式:
interface 接口名字 {
成员变量
成员方法
}
实现接口用关键字implements
入门案例:
interface A{
String name = "接口";
public void eat();
public void sleep();
}
class B implements A{
@Override
public void eat() {
System.out.println("吃好饭");
}
@Override
public void sleep() {
System.out.println("睡好觉");
}
}
public class Demo2 {
public static void main(String[] args) {
B b = new B();
b.eat();
b.sleep();
System.out.println(b.name);
}
}
接口注意事项:
1.使用关键字 interface 声明出来一个接口
2.接口面可以有属性,但是是static 和final修饰的属性。被称为常量。几乎不用
3.接口下面全部抽象的方法,不带方法体的
4.jdk1.8以后是可以有默认(default)的方法的,这个默认方法带有方法体【重点!!!】
5.接口下面没有构造方法,不能被实例化
6.去使用一个普通的类去实现这个接口,使用关键字implements
7.一定要在实现类中去实现所有的抽象方法
8.一个普通的类可以实现多个接口,弥补了单继承的局限性
9.一个接口可以去继承另外一个接口