7.面向对象(三)抽象类、接口

一、Final关键字
(1)修饰变量
a.final修饰变量,变量值不可以改变,首字母大写

 //final修饰一个变量,变量值不可以改变,这个变量就变成了一个字符常量,首字母大写
        final int A=10;
        Dog d=new Dog();//final修饰引用数据类型,地址将不会在改变
        //d=new Dog();//地址值不改变;

b.对象的属性依旧可以改变

//对象的属性依然可以改变
        d.age=19;
        d.weight=120;

c.

 final Dog d2=new Dog();
        a(d2);
        public static void a(Dog d){
        d=new Dog();
        }

d.

final Dog d2=new Dog();
a(d2);
public static void b(final Dog d){//final修饰,指向不可以改变
 //d=new Dog();

(2)修饰方法
final 修饰方法,这个方法不可以在子类中进行重写
(3)修饰类
final 修饰类,代表没有子类,该类不可以被继承,类被final修饰里面的方法不需要再用final修饰
(4)JDK提供的math类
a.使用math无需导包直接使用

package java.lang

b.math没有子类,不能被其他类继承

public final class Math(){
}

c.里面的属性全部被final修饰,方法也被final修饰,省略不写,原因:子类不需要重写
d.外界不可以创建对象

private Math()//构造器私有化

e.Math类中的所有属性,方法都被static修饰 ,只能通过类名.属性名或类名.方法名调用
二、抽象类、抽象方法
1.抽象类和抽象方法的关系
抽象类可以定义0-n个抽象方法
2.抽象类的作用
在抽象类中定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类中的抽象方法,然后可以扩展自己的内容,抽象设计避免了子类设计的随意性
代码:

//4.一个类中如果是抽象方法,那么这个类也要变成一个抽象类
//5.一个抽象类中可以有0-n个抽象方法
public abstract class Person {
    //1.子类堆方法十分满意,直接使用
    public void eat(){
        System.out.println("吃饭");
    }
    //2.子类方法永远不满意,对方法重写
    //3.方法体去掉,然后用abstract修饰,就会变成一个抽象方法
    public abstract void say();
    public abstract void sleep();
    /*public void say(){
        System.out.println("全世界都在说中国话");
    }*/
    //6.抽象类可以被其他类继承
    //7.一个类继承一个抽象类,那么这个类可以变成一个抽象类
    //8.一般子类不会用abstract修饰,一般会让子类重写父类中的抽象类
    //9.子类继承抽象类,就必须重写全部的抽象方法
    //10.子类如果没有重写全部的抽象方法,就必须在子类的前面加上abstract;
    static class Student extends Person{
        @Override
        public void say() {
            System.out.println("武侯人说武侯话");
        }

        @Override
        public void sleep() {
            System.out.println("睡觉");
        }
    }
    static class Demo{
        public static void main(String[] args) {
            //11.抽象类不可以创建对象
            //Person p=new Person;
            // 12.创建子类对象
            Student s=new Student();
            s.say();
            s.sleep();
            //多态的写法,父类引用指向子类对象
            Person p=new Student();
            p.eat();
            p.say();
        }
    }
    }

(1)抽象类不能创建对象,那么抽象类中是否有构造器?
抽象类中一定有构造器,构造器的作用给子类初始化对象的时候要先super调用父类构造器
(2)抽象类是否可以被final修饰?
不可以,抽象类设计的初衷是给子类继承用,被final修饰后就不能进行继承了
三、接口
1.JDK1.8前
(1)代码

1.类和接口是不同的概念,他们是同一层次
2.接口中没有构造器
3.接口如何声明:interface
4.JDK1.8之前,接口中只有俩部分内容
(1)常量:固定修饰符:public static final
(2)抽象方法:固定修饰符:public abstract
修饰符可省略不写
  */
public interface TestInterface {
    //常量
    public static final int NUM=10;
    //抽象方法
    public abstract void a();
    public abstract void b(int num);
    public abstract int c(String name);
}
interface TestInterface1{
    //常量
    public static final int AGE=12;
    //抽象方法
    public abstract void d();
}
/*5.类和接口之间的关系:类实现接口
6.一旦实现是一个接口,那么实现的类需要重写接口中的全部抽象方法
7.没有实现全部全部抽象方法,这个类需要变成一个抽象类
8.Java只有单继承,Java还有多实现
一个类继承其他类只能继承一个类
但是实现接口,可以实现多个接口
9.先继承,再实现class Student extends Person implements TestInterface,TestInterface1{
 */
class Student extends Person implements TestInterface,TestInterface1{

    @Override
    public void a() {
        System.out.println("1111");
    }

    @Override
    public void b(int num) {
        System.out.println("2222");
    }

    @Override
    public int c(String name) {
        return 0;
    }
    public void d(){
        System.out.println("3333");
    }
}
class Test{
    public static void main(String[] args) {
        //10.接口不可以创建对象
        //TestInterface t=new TestInterface();
        //接口具体实现类可以创建对象
        TestInterface t=new Student();//接口指向实现类,多态
        //11.接口中的常量可以用接口.常量名或者接口实现类.常量名
        System.out.println(TestInterface.NUM);
        System.out.println(Student.NUM);
        Student s=new Student();
        System.out.println(s.NUM);
        TestInterface t1=new Student();
        System.out.println(t1.NUM);
    }
}

(2)接口的作用
定义规则:接口定义好,实现类负责实现即可
(3)继承
继承:子类对父类的继承
实现:实现类对接口的实现
(4)多态应用场合
a.父类当作方法的形参,传入具体的子类对象
b.父类当作方法的返回值,返回值是具体的子类的对象
c.接口当作方法的形参,传入具体的实现类的对象
d.接口当作方法的返回值,返回的是具体的实现类的对象
(5)接口和抽象类的区别

抽象类:1、抽象类使用abstract修饰;2、抽象类不能实例化,即不能使用new关键字来实例化对象;3、含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;4、抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;5、如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类;6、抽象类中的抽象方法只有方法体,没有具体实现;

接口:1、接口使用interface修饰;2、接口不能被实例化;3、一个类只能继承一个类,但是可以实现多个接口;4、接口中方法均为抽象方法;5、接口中不能包含实例域或静态方法(静态方法必须实现,接口中方法是抽象方法,不能实现)

2.JDK1.8后新增方法
(1)被public default修饰的非抽象方法
a.default修饰符必须要加
b.实现类中想要重写非抽象方法,default必须要加
(2)静态方法
静态方法不可以重写
为什么在接口中加入静态方法?

//常量
    public static final int NUM=10;
    //抽象方法
    public abstract void a();
    //非抽象方法
    public default void b(){
        System.out.println("非抽象方法");
    }
    //静态方法
    public static void c(){
        System.out.println("静态方法");
    }

四、内部类
1.成员内部类
(1)类的组成:属性,方法,构造器,代码块(普通块,静态块,构造块,同步块),内部类
(2)内部类:局部内部类,(方法类,块类,构造器类)成员内部类
(3)成员内部类:属性,方法,构造器
修饰符private public default protect final
(4)内部类可以访问外部类的属性、方法等
(5)静态内部类不可以访问外部类的非static修饰的属性方法
(6)外部类要访问内部内,可以通过创建内部类对象访问内部类的属性和方法
(7)内部类和外部类属性重名的时候如何进行调用
(8)外部类、静态内部类、非静态内部类如何创建对象

/*
1.类的组成:属性,方法,构造器,代码块(普通块,静态块,构造块,同步块),内部类
 2.内部类:局部内部类,(方法类,块类,构造器类)成员内部类
 3.成员内部类:属性,方法,构造器
 修饰符private public default protect final
 4.内部类可以访问外部类的属性、方法等
 5。静态内部类不可以访问外部类的非static修饰的属性方法
 6.外部类要访问内部内,可以通过创建内部类对象访问内部类的属性和方法
 7.内部类和外部类属性重名的时候如何进行调用

*/

public class TestOuter {
    //成员内部类
    class B{
        int age=20;
        String name;
        public  void d(){
            int age=30;
            System.out.println(age);//30
            System.out.println(this.age);//20
            System.out.println(TestOuter.this.age);//30
            a();
        }
    }
    B b=new B();

    //静态内部类
    static class  c{
        int age;

    }
    //属性
    int age=10;
    //方法
    public void a(){
        {
            System.out.println("普通块");
        }
    }
    {
        System.out.println("构造块");   //先是构造块在是构造器
    }
    static {
        System.out.println("静态块");//静态块最先加载
    }
    //空构造器构造器
    public TestOuter() {
    }

    //
}
class Test{
    public static void main(String[] args) {
        //创建外部类对象
        TestOuter to=new TestOuter();
        //创建非静态成员内部类对象
        TestOuter t=new TestOuter();
        TestOuter.B b=t.new B();
        //创建静态成员内部类对象
        TestOuter.c C=new TestOuter.c();
    }
}

2.局部内部类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值