05、面向对象(狂神说)

  • 本质:以类的方式组织代码,以对象的方式组织(封装)数据

  • 抽象

  • 三大特性:-

    • 封装

    • 继承

    • 多态

    • 对象:是具体的事物

    • 类:是抽象的,是对象的抽象

00方法回顾

 //return:结束方法,返回一个结果
 //break:跳出switch,或结束循环

方法的调用:

  • 静态方法与非静态方法

    • 静态方法(static):属于类的。 调用方法:类名.方法名();

    • 非静态方法:属于类中对象的 调用方法:对象名.方法名();

01类与对象的创建

Student类:

 //属性:
 String name;//默认值:null
 int age;//默认值:0
 ​
 //方法
 public void study(){
     System.out.println(this.name+"在学习");
 }

对象的创建:

 Student xiaoming=new Student();

02构造方法

  1. 和类名相同

  2. 无返回值

作用:

  1. new本质是在调用构造方法

  2. 初始化对象的值

注意:定义有参构造之后,若想用无参构造,需显示定义一个无参的构造

生成构造函数快捷键:alt+insert

03创建对象的内存分析

Pet类:

 public class Pet {
 ​
     public String name;//默认值:null
     public int age;//默认值:0
 ​
     public void shout(){
         System.out.println("叫了一声");
     }
 }

main()方法:

     public static void main(String[] args) {
         Pet dog=new Pet();
 ​
         dog.name="旺财";
         dog.age=3;
         dog.shout();
 ​
         System.out.println(dog.name);
         System.out.println(dog.age);
 ​
         Pet cat=new Pet();
 ​
     }

04封装

程序设计追求高内聚,低耦合

属性私有,get/set

 public class Student {
     private String name;//名字
     private int id;//学号
     private char sex;//性别
     private int age;
     
     //提供可以操作属性的方法:get set
     public String getName() {
         return name;
     }
     
     public void setName(String name) {
         this.name = name;
     }
         //set中可以做一些安全性检测
     public void setAge(int age) {
         if (age > 120 || age < 0) {
             System.out.println("年龄可能写错了");
         } else {
             this.age = age;
         }
     }
 }

05继承

  • 关键字:extends

  • extends意为扩展。子类是父类的扩展

  • JAVA中类只有单继承,无多继承

  • 继承为类与类之间的一种关系。类和类指定的关系还有依赖、组合

  • 子类与父类从意义上讲具有”is a“的关系(子类 is a 父类)

  • Object类:JAVA中,所有类,都默认继承Object类

Person类:

 //JAVA中,所有类,都默认继承Object类
 //Person 人 :父类/基类
 public class Person {
 ​
     //private
     //protected
     //default
     //public
     private int money=10000000;
 ​
     public void say(){
         System.out.println("说了一句话");
     }
 ​
     public int getMoney() {
         return money;
     }
 ​
     public void setMoney(int money) {
         this.money = money;
     }
 }

Student类:

 //Student is a 人:子类/派生类
 //子类继承父类全部方法
 public class Student extends Person{
 ​
     //Ctrl+H
 ​
 }

Teacher类:

 public class Teacher extends Person{
     
 }

main()方法:

 public class Application {
     public static void main(String[] args) {
         Student student=new Student();
         student.say();
     }
 }

super

  1. super调用父类构造方法,必须在构造方法的第一行

  2. super必须只能出现在子类的方法或构造方法中

  3. super和this不能同时调用构造方法

对比 this:

  • 代表对象不同:

    • this:代表调用者本身这个对象

    • super:代表父类对象的引用

  • 前提:

    • this:没有继承也可以使用

    • super:只能在继承条件下才可以使用

  • 构造方法:

    • this():本类的构造

    • super():父类的构造

方法的重写

重写:需要有继承关系,子类重写父类方法!

 1. 方法名必须相同
 1. 参数列表必须相同
 1. 修饰符:范围可以扩大但不能缩小:public>protected>default>private
 1. 抛出的异常:范围可以被缩小但不能扩大:ClassNotFoundException-->Exception(大)

重写,子类和父类必须要一致,方法体不同!

为什么要重写:父类的功能,子类不一定需要,或者不一定满足

B类:

 public class B {
     public  void test(){
         System.out.println("B:test()");
     }
 }

A类(继承B类):

 public class A extends B{
 ​
     //@Override:重写
     @Override//注解:有功能的注释!
     public void test() {
         System.out.println("A:test()");
     }
 }

main()方法:

 A a=new A();
 a.test();
 ​
 //父类的引用指向子类
 B b=new A();//子类重写父类方法
 b.test();

运行结果:

A:test();

A:test();

06多态

  1. 多态是方法的多态,属性没有多态性

  2. 多态,是父类和子类,即必须有联系,否则 类型转换异常!ClassCastException!

  3. 多态存在条件:

    1. 有继承关系

    2. 子类重写父类方法

    3. 父类引用指向子类对象! Father f=new Son()

不能重写的方法:

  1. static 方法:静态方法属于类,不属于对象

  2. final 方法:最终方法

  3. private修饰的父类方法

eg:

Father f=new Son()

  1. f能执行哪些方法,要看Father类中有哪些方法

  2. f具体执行时,执行Son中的方法

07instanceof和类型转换

a instanceof A :判断a对象是否属于A类

  1. 把子类转换为父类:父类对象指向子类对象

  2. 把父类转换为子类,强制转换

person类:

 public class Person {
     
 }

Student类:

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

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
         
         //子类转转换为父类
         Person obj=new Student();
         //obj.go();
 ​
         //父类转换为子类
         ((Student)obj).go();
     }

08static关键字详解

 public class Student {
 ​
     //匿名代码块
     {
         System.out.println("匿名代码块");
     }
 ​
     //静态代码块:只执行一次
     static{
         System.out.println("静态代码块");
     }
     //构造方法
     public Student(){
         System.out.println("构造方法");
 ​
     }
 ​
     private static int age;//静态变量  多线程
     private double score;//非静态变量
 ​
     public void run(){
 ​
     }
 ​
     public static void go(){
 ​
     }
 ​
     public static void main(String[] args) {
         Student s1=new Student();
         Student s2=new Student();
 ​
         System.out.println(Student.age);
         //System.out.println(Student.score);语法错误
         System.out.println(s1.age);
         System.out.println(s1.score);
 ​
         Student.go();
         //Student.run();语法错误
         s1.run();
     }
 }

09抽象类

  1. 抽象类不能创建实例,即不能new抽象类

  2. 抽象类中可以写普通方法

  3. 抽象方法必须在抽象类中

Action类:

 //abstract 抽象类:类 单继承
 public abstract class Action {
     //抽象方法:只有方法名,没有方法实现
     public abstract void doSomething();
 ​
     public  void hello(){
         System.out.println("hello");
     }
 }

A类:

 public class A extends Action{
     @Override
     public void doSomething() {
 ​
     }

10接口

对比:

  • 普通类:只有具体实现

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

  • 接口:只有规范!自己无法写方法。定义的是一组规则

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

接口作用

  1. 约束(即方法的声明)

  2. 2.定义一些方法,让不同人实现

  3. 默认 方法的前缀都是public abstract

  4. 默认 属性的前缀都是public static final

  5. 接口不能被实例化,接口中没有构造方法

  6. implements可以实现多个接口

  7. 必须重写接口中的方法

11内部类

Outer类:

 ublic 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);
         }
     }
 ​
     //方法中也可以写class
     public void method(){
         class Inner{
             class InnerB{
             }
         }
     }
 }
 ​
 //一个Java类中可以有多个class类,但只能有一个public class
 class Apple{
     public void eat(){
 ​
     }
 ​
 }

main()方法:

public static void main(String[] args) {
    //new一个外部类
    Outer outer=new Outer();
    //通过外部类实例化内部类
    Outer.Inner inner=outer.new Inner();
    //匿名内部类
    new Apple().eat();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值