java入门13--面向对象(下)

Posted acrifhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java入门13--面向对象(下)相关的知识,希望对你有一定的参考价值。

java入门13

多态

  • 动态编译:类型:可扩展性
  • 即同一方法可以根据发送对象的不同而采取多种不同的行为方式
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
  • 多态存在的条件
    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类对象
  • 注意:多态是方法的多态,属性没有多态性
  • instanceof 判断一个对象是什么类型

例子:

父类:

public class Person {
    public void run(){
        System.out.println("I am a person");
    }
}

子类:

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("I am a student");
    }
    public void eat(){
        System.out.println("I am eating");
    }
}

主程序:

public class Main {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //
        //可以指向的引用类型就不确定了,父类的引用指向子类
        Person s1 = new Person();
        Person s2 = new Student();
        Object s3 = new Student();
        Student s4 = new Student();
        //Student能调用的方法都是自己的或者继承父类的

        //对象能执行哪些方法主要看左边的类型,与右边关系不大
        s2.run();//I am a student
        s1.run();//I am a person
        s4.eat();//I am eating
        ((Student)s2).eat();//I am eating 强制转换可使父类调用子类独有方法
    }
}
/*
无法重写的:
	1,static 方法,属于类,不属于实例
	2,final 常量
	3,private 方法
*/

instanceof

还是刚刚的例子,加一个Teacher类继承Person

public class Main {
    public static void main(String[] args) {
        Object object = new Student();
        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
    }
}

强制转换

方便方法调用,减少代码

public static void main(String[] args) {
        //类型之间的转换
        //低-------->高
        Person s1 = new Student();
        //高-------->低
        Student s11 = (Student) s1;
        //子类转父类可能会丢失一些自己的方法
    }

static详解

//static:
public class Student {
    private static int age=10;//静态变量
    private double score=100;

    //非静态方法可任意调用静态方法里的东西
    public void run(){
        go();
    }
    public static void go(){

    }

    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(Student.age);//静态变量可通过类名调用
        System.out.println(Student.score);//报错
        System.out.println(student.score);
        System.out.println(student.age);
        go();
    }
}
public class Person {
    {
        //代码块:匿名代码块
    }
    static {
        //静态代码块
    }
}

测试一下:

public class Person {
    {
        System.out.println("匿名代码块");
    }
    static {
        System.out.println("静态代码块");
    }
    public Person(){
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person p1 = new Person();
    }
}
/*
    执行结果:
    静态代码块
    匿名代码块
    构造方法
 */

可见执行顺序:静态代码块>匿名代码块>构造方法

    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println("------------------------");
        Person p2 = new Person();
    }
}
/*
    执行结果:
    静态代码块
    匿名代码块
    构造方法
    ------------------------
    匿名代码块
    构造方法
 */

可以见到,静态代码块只会执行一次

匿名代码块一般可以用来赋初始值

//静态导入包
import static java.lang.Math.random;

public class Text {
    public static void main(String[] args) {
        System.out.println(Math.random());//产生一个随机数
        System.out.println(random());//通过上面添加static的引入省略了写Math
    }
}

抽象类

  • abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类
  • 抽象类中可以设有抽象方法,但是有抽象方法的类一定要声明为抽象类
  • 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
  • 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
package oop.demo07;

//abstract 抽象类
public abstract class Action {
    //约束~有人帮我们实现
    //abstract只有方法名字,没有方法实现
    public abstract void a();//不能方法有abstract,类没有

    /*特点:
    1.不能new出来,只能靠子类实现:约束
    2.抽象方法必须在抽象类中
    3.抽象类中也可以写普通方法
     */
}
package oop.demo07;

//抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非子类也是abstract,方法由子子类实现
public class A extends Action{
    @Override
    public void a() {

    }
}

接口

  • 普通类:只有具体实现

  • 抽象类:具体实现和规范(抽象方法)都有

  • 接口:只有规范

  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是—则必须能—”的思想。

  • OO的精髓,是对对象的抽象,最能体现这一点的是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理地去抽象

声明类的关键字是class,声明接口的关键字是interface

示例:

接口一:

package oop.demo09;

//接口都需要有实现类
public interface UserService {

    //常量 public static final
    int age = 19;

    //接口中所有定义其实都是抽象的public abstract
    void run(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}

接口二:

package oop.demo09;

public interface TimeService {
    void timer();
}

实现接口:

package oop.demo09;

//抽象类:extends 单继承
//类可以实现接口 implements 接口 可以"多继承"
//实现了接口中的类,就必须重写接口中的方法
public class UserServiceImpl implements UserService,TimeService{

    @Override
    public void run(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}

内部类:

  • 比如A类中定义一个B类,那么B类相对A类就是内部类,A相对B是外部类
  • 1.成员内部类
  • 2.静态内部类
  • 3.局部内部类
  • 4.匿名内部类
package oop.demo10;

public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }
    class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        //获得外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
    }
}
package oop.demo10;

public class Main {
    public static void main(String[] args) {
        //new
        Outer o1 = new Outer();

        //通过这个外部类来实例化内部类
        Outer.Inner i1 = o1.new Inner();
        i1.in();//输出:这是内部类的方法
        i1.getID();//10
    }
}

如果改成静态内部类,就不能访问静态属性id了:

static class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
    }
public class Outer {

}
//一个java类中可以有多个class类,但是只能有一个public class
class A{//不能在前面加public
    
}

局部内部类:

public class Outer {
    
    //局部内部类
    public void method(){
        class Inner{
            public void in(){}
        }
    }
}

匿名内部类:

package oop.demo10;

public class Main {
    public static void main(String[] args) {
        //没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();

        new UserService(){
            @Override
            public void hello() {

            }
        };
    }
}

class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface UserService{
    void hello();
}

以上是关于java入门13--面向对象(下)的主要内容,如果未能解决你的问题,请参考以下文章

java入门13--面向对象(下)

JavaSE入门学习13:Java面向对象之封装

Java入门——面向对象基础

Java从入门到天黑|05JavaSE入门之面向对象(下)

Java从入门到天黑|05JavaSE入门之面向对象(下)

java入门12--面向对象(上)