zoukankan      html  css  js  c++  java
  • JAVA Class7

    学习内容:

    1.抽象类:

    public abstract class Perimeter {
        public abstract double formula(double i);//没有实现体,是个空方法
        //当一个类有抽象方法的时候,该类必须被声明为抽象类,抽象类不一定有抽象方法
        //抽象类无法被实例化,当一个抽象类被当做一个参数传入一个方法时,可以将其子类实例化传入方法中,实现默认向上转型
        //方法修饰词只能是protected public
        public void test() { //抽象类中的方法可以是普通方法
            System.out.println("非抽象方法");
        }
    }
    public class Circle extends Perimeter {
        double r;
        public double formula(double r) { //继承的父类如果有抽象方法,必须重写抽象方法,否则该类必须声明为抽象类
            double perimeter = Math.PI*r*r;
            return perimeter;
        }
    }

    2.接口

    接口可看做一种特殊的抽象类

    public interface Formula {
        public static final int a = 0; //接口内成员变量默认且只能为常量
        public double perimeter(double i);//抽象方法
        default void test() { //JDK1.8开始支持默认方法,默认方法是有方法体的,修饰词只能是static default
            System.out.println("默认方法");
        };
    }
    public class Square implements Formula{
        public double perimeter(double r) { //重写抽象方法
            double sum = r*r;
            return sum;
        }
    }

    3.接口与抽象类的区别

    区别1:
    子类只能继承一个抽象类,不能继承多个
    子类可以实现多个接口
    区别2:
    抽象类可以定义
    public,protected,package,private
    静态和非静态属性
    final和非final属性
    但是接口中声明的属性,只能是
    public static final,且必须被初始化,即只能是常量

    区别3:接口修饰词只能是public abstract default(不写) 接口内抽象方法的修饰词只能是 public abstract default(JDK1.8默认方法)

    另外,接口可以将方法和类进行剥离,只要实现了接口,就一定能调用接口中的方法

    需要定义子类的行为,又要为子类提供共性功能时才选用抽象类; 

    4.继承关系

    public interface Testp {
        public void test();
    }
    
    public abstract class Test implements Testp {
        public abstract void test2();
        //虽然父类实现了Testp接口,但其本身是个抽象方法,所以可以不重写接口里的抽象方法
    }
    
    public class Testson extends Test {
        public void test2() {
            System.out.println("重写父类抽象方法");
        }
        public void test() {
            System.out.println("重写父类引用的接口方法"); //如果抽象父类实现了接口,则接口中的方法也会被继承,同时要重写
        }
    }

    接口之间的继承

    public interface F {
        public void f();
    }
    
    public interface S extends F{
        public void s();
    }
     //类在实现接口S时,要重写f()以及s()

     5.多态

    Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。

    例如方法的重写就是一种多态的体现,另外还有+运算的多态,既可以执行加法,也可以执行字符串拼接。

    注意,如果是char与数值类型相加得到的是char字符的ascii值与数值相加后的和。

    public class Person {
        int age;
        public void walk() {
            System.out.println("人类行走");
        }
        private void watch() {
            System.out.println("观看");
        }
        public Person(int age) {
            this.age =age;
        }
        public void prints() { //打印成员变量age
            System.out.println(this.age);
        }
        public void printss() { //打印成员变量s
            System.out.println(this.s);
        }
        int s = 10;
        public static void main(String[] args) {
            Person p1 = new Person(9);//向上转型,把student当做person用
            Student s = new Student(3);
            p1 = s;
            Person p2 = new Person(10);
            p1.walk();//调用student重写后的方法
            p2.walk();
            p1.watch();//调用person的方法,所以既可以调用子类重写后的方法,也可以调用父类的私有方法
            p1.prints(); //构造器中赋值的成员变量读子类,打印出3
            p1.printss();//直接赋值的成员变量读父类,打印出的数据是10
            System.out.println(p1 instanceof Student); //判断p1所属类型
        }
    }
    public class Student extends Person {
        public void walk() {
            System.out.println("学生行走");
        }
        public Student(int age) {
            super(age);
        }
        int s = 5;
    }

    编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。

    运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。

    简而言之:编译看左边,运行看右边。

    转型可以理解为:拿上例举例来说,Person p = new Student();,可以理解为人类中的学生,本质是人“类”但同时也是学生,所以调用学生类重写后的方法,但如果是调用类方法,则还是调用Person的类方法。

    另外,Object类是所有类的父类,可以由Object类向下强转子类。

    向下转型:

    需要用父类调用子类特有的方法时,需要向下转型

    public class Person {
        int age;
        public void walk() {
            System.out.println("人类行走");
        }
        private void watch() {
            System.out.println("观看");
        }
        public Person(int age) {
            this.age =age;
        }
     }
    public class Student extends Person {
        public void walk() {
            System.out.println("学生行走");
        }
        public Student(int age) {
            super(age);
        }
        public void study(){
            System.out.println("学习");
        } 
    }
    class Test {
       public static void main(String[] args){
            Person p = new Student();
            System.out.print(p instanceof Student);//判断对象类型
            Student s = (Student)p;
            s.study(); //向下转型可以使用Student独有的方法
       }  
    }

     6.多态应用

    public interface Usb {
        public void open();
        public void close();
    }
    
    public class Laptop  {
        public void poweron() {
            System.out.println("笔记本开机");
        }
        public void poweroff() {
            System.out.println("笔记本关机");
        }
        public void use(Usb usb) { 
            usb.open();
            usb.close();
        }
    }
    
    public class Mouse implements Usb {
        public void open() {
            System.out.println("鼠标连接成功");
        }
        public void close() {
            System.out.println("鼠标连接断开");
        }
    }
    
    public class Keyboard implements Usb {
        public void open() {
            System.out.println("键盘连接成功");
        }
        public void close() {
            System.out.println("键盘连接断开");
        }
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Laptop l = new Laptop();
            l.poweron();
            l.use(new Mouse()); //Usb usb = new Mouse();向上转型,把Mouse对象当做Usb接口用
        }
    }
  • 相关阅读:
    Membership和Role Providers
    浏览器兼容手册
    手机开发与测试的Firefox插件:User Agent Switcher
    控制input输入框的高度
    纯 CSS3 打造的按钮实例
    CSS对各个浏览器兼容
    网页配色的天然范儿
    Jquery的each里面用return false代替break; return ture 代替continue
    li标签float:left,IE6中第二行会空缺一块,ie8和FF正常,怎么解决?
    用XMLHTTP实现无刷新的与server通信
  • 原文地址:https://www.cnblogs.com/whwjava/p/8662949.html
Copyright © 2011-2022 走看看