Day 12

多态 

 

 

package com.oop.demo06;

public class Person {
    public void run(){
        System.out.println("run");
    }
}


/*
多态注意事项:
   1.多态是方法的多态,属性没有多态
   2.父类和子类,有联系   类型转换异常! ClassCastException
   3.存在的条件: 继承关系,方法需要重写  父类引用指向子类对象  father f1 = new Son();

   不能重写的:
      1.static 静态方法属于类,它不属于实例
      2.final 常量;
      3.private 方法
* */

/*
package com.oop.demo06;

public class Student extends Person {

    @Override
    public void run() {
        System.out.println("son");
    }
    public void eat(){
        System.out.println("eat");
    }
}


package com.oop;

import com.oop.demo06.Person;
import com.oop.demo06.Student;

public class Application {

    public static void main(String[] args) {

        //一个对象的实际类型是确定的
//        new Student();
//        new Person();

        //可以指向的引用类型就不确定了:父类的引用指向子类

        //Student能调用的方法都是自己的或者继承父类的
        Student s1 = new Student();
        //Person 父类型,可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();
        Object s3 = new Student();


        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
        s2.run();//子类重写了父类的方法,执行子类的方法
        s1.run();
        s1.eat();


    }
}

* */

 instanceof和类型转换

判断一个对象是什么类型

package com.oop.demo06;

public class Person {
    public void run(){
        System.out.println("run");
    }
}




/* 
//Object > String
        //Object > Person > Teacher
        //Object > Person > Student
        Object object = new Student();

        //System.out.println(X instanceof Y);//能不能编译通过,取决于X是否与Y有继承关系,且类X是实例X的引用类型

        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
        System.out.println("==============================");

        Person person = new Student();

        System.out.println(person instanceof Student);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof Object);//true
        System.out.println(person instanceof Teacher);//false
        //System.out.println(person instanceof String);//编译报错
        System.out.println("==============================");

        Student student = new Student();

        System.out.println(student instanceof Student);//true
        System.out.println(student instanceof Person);//true
        System.out.println(student instanceof Object);//true
        //System.out.println(student instanceof Teacher);//编译报错
        //System.out.println(student instanceof String);//编译报错
        
        
package com.oop.demo06;

public class Student extends Person {
 
    public void go(){
        System.out.println("go");
    }
}



package com.oop;

import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;

public class Application {

    public static void main(String[] args) {

//        //类型之间的转化:父  子
//     
//        //高                   低
//        Person obj = new Student();
//        
//        //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了!
//
        Student student = (Student) obj;
        student.go();
//        ((Student) obj).go();

        
        //子类转换为父类,可能丢失自己本来的一些方法!
        Student student = new Student();
        student.go();
        Person person = student;
        
    }

}
/*
1.父类引用指向子类的对象
2.把子类转换为父类,向上转型
3.把夫类转换为子类,向下转型,强制转换
4.方便方法的调用,减少重复的代码

抽象:封装,继承,多态       抽象类,接口
* */

static 

非静态的方法可以调用静态方法的东西,而静态方法可以调用静态方法的

package com.oop.demo07;


//static :
public class Student {

    private static int age;//静态变量
    private double score;//非静态变量

    public void run(){

        go();
    }

    public static void go(){

    }

    public static void main(String[] args) {

        new Student().run();
        go();

    }

}
package com.oop.demo07;

public class Person {

    //2  :赋初始值
    {
        System.out.println("匿名代码块");
    }

    //1  :  只执行一次!
    static {
        System.out.println("静态代码块");
    }

    //3
    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("==================================");
        Person person2 = new Person();
    }
}
package com.oop.demo07;

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

public class Test {

    public static void main(String[] args) {

        System.out.println(random());
        System.out.println(PI);
    }
}

抽象类

 

抽象类的作用: 

  • 定义共同的属性和方法: 抽象类可以包含属性和方法的定义,这些属性和方法可以被其子类继承和重写。这有助于实现代码的复用和共享,使得子类可以继承父类的通用行为和状态。12
  • 限制继承和实例化: 抽象类不能被实例化,只能被继承。这种设计用于限制某个类只能作为父类存在,不能被直接实例化。这有助于控制类的层次结构和实例的创建方式。1
  • 强制子类实现抽象方法: 抽象类中可以包含抽象方法,子类必须实现这些抽象方法。这确保了所有子类都具有一致的行为,同时也提供了灵活性,因为子类可以根据自己的需求重写这些方法。
  • 提高代码的可维护性、扩展性和灵活性: 通过使用抽象类,可以更好地组织代码结构,提高代码的可维护性和扩展性。抽象类作为模板,为子类提供了一组固定的行为描述,而具体的实现细节则留给子类去完成。2

总之,抽象类在Java中扮演着重要的角色,它们是面向对象编程中的一个核心概念,通过继承和抽象方法的引入,使得代码更加模块化、可重用和可扩展。

package com.oop.demo08;

//abstract 抽象类  : 类    extends :单继承     (接口可以多继承)
public abstract class Action {

    //约束  有人帮我们实现
    //abstract  抽象方法,只有方法名字,没有方法的实现!
    public abstract void doSomething();

    //1.不能new这个抽象类,只能靠子类去实现它:约束!
    //2.抽象类中可以写普通方法
    //3.抽象方法必须在抽象类中

    //抽象的抽象:约束
}
/*
package com.oop.demo08;

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

    }
}
 
*/

接口 

 

package com.oop.demo09;

//抽象的思维

//interface 定义的关键字,接口都需要实现类
public interface UserService {

    //属性默认的常量,public static final
    int AGE = 99;

    //接口中的所有定义的方法其实都是抽象的  public abstract
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}
package com.oop.demo09;

public interface TimeService {
    void timer();
}
package com.oop.demo09;

//抽象类: extends
//类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中的方法

//多继承 利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}
作用:
   1.约束
   2.定义一些方法,让不同的人实现~  10--->1
   3.方法 public abstract
   4.常量 public static final
   5.接口不能被实例化~,接口中没有构造方法~
   6.implements可以实现多个接口
   7.必须要重写接口中的方法 

N种内部类

 

package com.oop.demo10;

public class Outer {

    private int id = 10;
    public void out(){
        System.out.println("这是外部类的方法");
    }

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

        public void getID() {
        }
    }

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

            }
        }
    }

}

//一个Java类中可以有多个class类,但是只能有一个public class
class A{

}
package com.oop.demo10;

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

        UserService userService = new UserService(){
            @Override
            public void hello() {
            }
        };
    }
}

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

interface UserService{
    void hello();
}
package com.oop;

import com.oop.demo10.Outer;

public class Application {

    public static void main(String[] args) {

        Outer outer = new Outer();

        //通过这个外部类来实例化内部类~
        Outer.Inner inner = outer.new Inner();
        inner.getID();
    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值