Java面向对象

目录

初识面向对象

面向过程&&面向对象

什么是面向对象

回顾方法及加深

方法的定义

方法的调用

对象的创建与分析

类与对象的关系

创建与初始化类

构造器

简单小结类与对象

面向对象的三大特性

封装

继承

多态

instanceof 关键字

类型转换

static关键字

抽象类与接口

抽象类

接口

内部类

成员内部类

静态内部类

局部内部类

匿名内部类


初识面向对象

面向过程&&面向对象

  • 面向过程思想

    • 步骤清晰简单,第一步做什么,第二部做什么...

    • 面对过程适合处理一些较为简单的问题

  • 面向对象思想

    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。

      最后,才对某个分类下的细节进行面向过程的思索

    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题

  • 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。

    但是,具体到微观操作,仍然需要面向过程的思路去处理。

什么是面向对象

  • 面向对象编程( Object-Oriented Programming,opp)

  • 面向对象编程本质就是:以类的方式组织代码,以对象的组织(封装)数据。

  • 抽象(自己理解抽象:在一个项目中 抽出来相同的类)

  • 三大特性

    • 封装

    • 继承

    • 多态

  • 从认识角度考虑是:先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

  • 从代码角度考虑是:先有类,后有对象。类是对象的模板

回顾方法及加深

方法的定义

  • 修饰符

  • 返回类型

  • break和return的区别

    • break:跳出switch语句,结束循环

    • return:结束方法,返回一个结果。return写任何东西都会报错

  • 方法名:注意规范即可,见名知意

  • 参数列表:(参数类型,参数名)...可变长参数

  • 异常抛出:疑问?后面讲解

package com.opp.opp;
​
import java.io.IOException;
​
public class Opp0201 {
    public static void main(String[] args) {
​
    }
    /*
       修饰符 返回值类型 方法名(...){
       方法体
       return 返回值;
       }
     */
    public String sayHello(){
        return "Hello World";
    }
    public void print(){//不返回东西
        return;//可以不写,也可以这样写
    }
    public int max(int a, int b){
        return a > b ? a : b;//三元运算符 :如果a>b 返回a 否则 返回b
    }
    //数据下标越界: Arrayindexoutofbounds
    //异常
    public  void read() throws IOException{
​
    }
}

方法的调用

  • 静态方法

  • 非静态方法

  • 形参和实参

  • 值传递与引用传递

  • this关键字

//静态方法与非静态方法
package com.opp.opp;
​
public class Opp0301 {
    public static void main(String[] args) {
        int c = max(1,2);
        System.out.println(c);
        //实例化这个类
        //对象类型  对象名= 对象值;
        Opp0301 opp0301 = new Opp0301();
        int i = opp0301.max1(1, 2);
        System.out.println(i);
    }
    //静态与非静态都可以在其他类中定义,被此类调用(eg:在Student类中定义了方法,可以在Opp0301类中调用)
    //静态方法
    public static  int max(int a,int b){
        return a+b;
    }
    //非静态方法
    public int max1(int d,int f){
        return d+f;
    }
    //如果两个方法都是非静态方法可以直接调用,两个都是静态方法也可以直接调用
    public void a(){
        b();
    }
    public void b(){
        a();
    }
    //如果两个方法一个是static静态方法,一个是非静态方法,则没办法直接调用
    //原因:   static静态方法是和类一起加载的  非静态方法是实例化(对象创建)之后才存在的
}

//实参与形参
package com.opp.opp;
​
public class Opp0302 {
    public static void main(String[] args) {
        //实际参数与形式参数的类型要对应!
        Opp0302 opp0302 = new Opp0302();
        int add = opp0302.add(1, 2);//实际参数
        System.out.println(add);
    }
    public int add(int a,int b){//形式参数
        return a+b;
    }
}
//值传递:
package com.opp.opp;
​
public class Opp0303 {
    //实参传递给形参的是值   形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参
    //形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;
    public static void main(String[] args) {
        int a = 1;
        System.out.println(a);//:1
        Opp0303.change(a);
        System.out.println(a);//:1
    }
    public static void change(int a){
        a=100;
    }
    //再通俗的讲法就是:
    //小明去餐厅吃饭,看见别人点的红烧肉挺好吃,九把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,
    // 小明吃完了,但是他吃的红烧肉跟旁边那个人吃的是一份吗?当然不是。
}
package com.opp.opp;
//引用传递:一般传递一个对象,本质还是值传递
public class Opp0304 {
    public static void main(String[] args) {
        //对象类型 对象名= 对象值;
        Person person = new Person();
        System.out.println(person.name);//输出结果:null
        Opp0304 opp0304 = new Opp0304();
        opp0304.change(person);
        System.out.println(person.name);
    }
    public   void change(Person person){
        //person 是一个对象:指向的是---> Person person = new Person();这是一个具体的人,可以改变属性
        person.name = "常";
    }
​
}
//定义了一个Person类,有一个属性name
class Person{
    String name;
}

对象的创建与分析

类与对象的关系

  • 类是一种抽象的数据类型,他是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。

    • 动物、植物、手机、电脑......

    • Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点与行为

  • 对象是抽象概念的具体案例

    • 张三就是人的一个具体案例,张三家的旺财就是狗的一个具体案例

    • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念

创建与初始化类

  • 使用new关键字创建对象

  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及

    类中构造器的调用

package com.opp.opp04_;
//一个项目中应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //类:抽象的,实例化
        //类实例化后会返回一个自己的对象!
        //student对象就是一个Student类的具体案例
        //Student student = new Student();
        Student xm = new Student();
        xm.name = "小明";
        xm.age = 9;
        xm.study();
    }
}

package com.opp.opp04_;
​
public class Student {
    //属性:字段
    String name;
    int age;
    //方法
    public void study(){
        System.out.println(this.age+"岁"+this.name+"在学习");
    }
}

构造器

  • 类中的构造器也称为构造方法,是进行创建对象的时候必须要调用的。并且构造器有以下两个

    • 特点

    1. 必须与类的名字相同

    2. 必须没有返回类型,不能写void

    • 作用

      • new 本质是在调用构造方法

      • 初始化对象的值

    • 注意点

      • 定义了有参构造,如果想要使用无参构造,需要显示一个无参构造

  • 构造器必须掌握

package com.opp.opp04_;
​
public class Person {
​
    //一个类即使什么都不写,他也会存在一个方法:无参构造器
    //无参构造器,public Person(){} 可以不出现
    //但当类中有有参构造器时,想要new默认构造器方法,
    // 必须把默认构造器写出来
    String name;
    //实例化初始值
    // 作用:1.使用new关键字,必须要有构造器
    public Person(){
​
    }
    //new 有参构造器:
    //Person person = new Person("xiaoming");
    //                xiaoming对应参数
    //有参构造:一但定义了有参构造,无参构造就必须显示定义
    //且默认的把无参构造空着,它什么都不用干
    public Person(String name){
        this.name = name;
        //this.name 代表是当前类的 = name 代表是参数传进来的
    }
    //快捷键(笔记本):fn+alt+insert 创建构造器
    //alt+insert 创建构造器
}

简单小结类与对象

  1. 类与对象

    • 类是一个模板(抽象),对象是一个实例。

  2. 方法

    • 定义、调用

  3. 对象的引用

    • 引用类型: 基本类型(8)

    • 对象是通过引用来操作的:栈--->堆(地址) 引用就是指向对象的一个地址

  4. 属性:字段Field 成员变量

    • 默认舒适化:

      • 数字 0 0.0

      • char :u0000

      • boolean:false

      • 引用:null

    • 定义:修饰符 属性类型 属性名 = 属性值

  5. 对象的创建和使用

    • 必须使用new关键字创建对象,构造器 Person csc = new Person();

    • 对象的属性:eg: csc.name

    • 对象的方法: csc.say()

  6. 类:

    • 静态的属性:属性

    • 动态的行为:方法

面向对象的三大特性

  • 封装

  • 继承

  • 多态

封装

  • 该露的露,该藏的藏

    • 我们程序设计要追求"高内聚,低耦合"。

      • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉

      • 低耦合:仅暴露少量的方法给外部使用

  • 封装(数据的隐藏)

    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏

  • 记住:属性私有,get/set

  • 封装的意义:

    1. 1.提高程序的安全性,保护数据

    2. 隐藏代码的实现细节

    3. 统一接口

    4. 系统维护性增加了

package com.opp.opp08;
//学生类   private :私有
public class Student {
    //属性私有
    private String name;//名字
    private int age;//年龄
    private char sex;//性别
    //属性变得私有,我们new了一个对象也没办法调用,因此需要
    //提供一些可以操作这个属性的方法
    //提供一些public的get、set方法

    //快捷键:fn+alt+insert--->Getter and Setter: 自动补全get和set

    //get:获得这个属性
    public String getName() {
        return name;
    }
    //set:给属性设置值
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>120||age<0){
            this.age = 3;
        }else{
        this.age = age;
        }
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

Main方法中调用

package com.opp;
import com.opp.opp08.Student;
public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("常哥哥");
        System.out.println(s1.getName());
        s1.setAge(999);
        System.out.println(s1.getAge());
    }
}

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

  • extands的意思是“扩展”。子类是父类的扩展

  • JAVA中类只有单继承,没有多继承。也就是(一个儿子是能有一个爸爸,而一个爸爸可以有多个儿子)

  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

  • 继承关系的两个类,一个为子类(派生类),一个为父类。子类继承父类,使用关键字extands来表示

  • 子类与父类之间,从意义上讲应该具有 "is a"的关系

父类:Person

package com.opp.opp09;
//Person 人
public class Person {
    //public            优先级有高到底
    //protected
    //default
    //private
    private int money = 10_0000_0000;
    public void say(){
        System.out.println("你好,世界");
    }

}

子类:Student02

package com.opp.opp09;
//Student is Person :派生类,子类
//子类继承了父类,就会拥有父类的全部方法
//父类私有的东西,没办法继承。父类中必须有set、get方法,子类才能继承
public class Student02 extends Person{
}

  • object类

    • 在JAVA中所有的类,都默认直接或者间接继承Object类

  • super

    • 注意点

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

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

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

    • 与this的比较

      1. 代表的对象不同

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

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

    • 前提

      • this:没有继承也能使用

      • super:只能在继承的条件下使用

    • 构造方法

      • this():调用本类的构造

      • super():调用父类的构造

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

    1. 方法名必须相同

    2. 参数列表必须相同

    3. 修饰符:范围可以扩大,但是不能缩小。:public>protected>default>private

    4. 抛出的异常:范围可以缩小,但是不能扩大。

    重写,子类的方法和父类的方法必需一致;方法体不同

  • 为什么要重写

    • 父类的功能,子类不一定需要,或者不满足

    快捷键:笔记本:fn+alt+insert----->overriide

main

package com.opp;
import com.opp.opp09.A;
import com.opp.opp09.B;

//一个项目中应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
//静态的方法和非静态的方法区别很大!
        //静态方法:方法的调用只和左边(定义的数据类型)有关 父子类中定义方法: public static
        //非静态方法:重写  父子类中定义方法:public
        A a = new A();
        a.print();//A
        //静态:父类的引用指向了子类。输出结果为B
        //非静态:子类重写了父类的方法。输出结果为A
        B b = new A();
        b.print();//B
    }
}

父类

package com.opp.opp09;

public class B {
    public /*static*/ void print(){
        System.out.println("B");
    }
}

子类

package com.opp.opp09;

public class A  extends B{
    //Override:重写
    //重写都是方法的重写,跟属性无关
    @Override//注释,有功能的注释
    public void print() {
        System.out.println("A");
    }
}

多态

  • 动态编译:类型:可扩展性

  • 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式

  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

  • 多态存在的条件

    • 有继承关系

    • 子类重写父类的方法

    • 父类引用指向子类对象

  • 注意:

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

    2. 父类与子类之间要有联系。 这里会报一个异常,类型转换异常。ClassCastExcption

    3. 多态必要的存在条件:继承关系,方法需要重写,父类的引用指向子类对象

      方法不能重写

      1. static 方法是静态的,属于类。它不属于实例

      2. final 常量;

      3. private方法;

主类:

package com.opp;
import com.opp.opp10.Person;
import com.opp.opp10.Student;
//一个项目中应该只存在一个main方法
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();
        //对象能执行那些方法,主要看对象左边的类型,和右边关系不大!
        s1.run();//son
        s1.e();//Father e   :子类可以调用父类的方法
        s2.run();//son      :子类重写了父类的方法,当父类调用父类与子类都有的方法时,执行子类的方法
        s2.e();//Father e   :
        //s2.eat();           :父类调用不了 父类没有,子类有,的子类方法
        ((Student)s2).eat();//:类型转换     将s2(父类)强制转换成Student(子类)
    }
}

父类Person

package com.opp.opp10;

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

子类:Student

package com.opp.opp10;

public class Student extends Person{

    public void run(){
        System.out.println("son");
    }
    public void eat(){
        System.out.println("Son Eat");
    }
}

instanceof 关键字

  • instanceof :判断一个对象是什么类型

package com.opp;
import com.opp.opp10.Person;
import com.opp.opp10.Student;
import com.opp.opp10.Teacher;

//一个项目中应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
                //object>string
        //object>Person>Teacher
        //object>Person>Student

        //System.out.println(X instanceof Y);   能不能编译通过取决于 X与Y之间是否存在父子关系
        Object object = new Student();
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Student);//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 Object);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof Student);//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 Object);//true
        System.out.println(student instanceof Person);//true
        System.out.println(student instanceof Student);//true
        //System.out.println(student instanceof Teacher);//编译报错
        //System.out.println(student instanceof String);//编译报错
        System.out.println("==========================");
        /*
        编译报错:取决于对象类型    如果对象类型与比较类型等级相同或比比较类型小且没有关系     编译报错
        ture:取决于引用类型       如果引用类型与比较类型有关系               true
        false:取决于引用类型       如果引用类型与比较类型无关系               false
         */

    }
}

类型转换

package com.opp;
import com.opp.opp10.Person;
import com.opp.opp10.Student;
import com.opp.opp10.Teacher;

//一个项目中应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //                       类型转换
        //类型之间的转换:父-->子                 强制转换
        //高                 低
        Person s1 = new Student();
        //s1 讲这个对象转换成Student类型,我们就可以使用Student类型的方法了
//        Student person = (Student)s1;     //  第一种转换方式
//        person.eat();
        ((Student)s1).eat();//第二种转换方式
        //子类转换为父类,不用强制转换。可能会丢失自己本来的一些方法
        Student s2 = new Student();
        Person person = s2;
        /*
        1.存在条件:父类引用指向子类的对象
        2.把子类转换为父类,向上转型。不是需要强制转换(低转高)
        3.把父类转换为子类,向下转型。需要强制转换(高转低)
        4.作用:方便方法的调用,减少重复的代码!简洁

         */
    }
}

static关键字

package com.opp.opp14;
// 静态方法可以直接调用静态变量,不用new对象
// 静态方法不可以直接调用非静态变量,必须new对象
//静态方法不可以直接调用非静态方法,必须new对象
//非静态方法可以直接调用静态变量
//非静态方法可以直接调用非静态变量
//非静态方法可以直接调用静态方法
public class Student {
    private  static  int age;//静态变量
    private String name;//非静态变量
//    public static void run(){
//        Student s2 = new Student();
//        s2.go();
//        System.out.println("run");
//
//    }
//    public void go(){
//        Student.age = 18;
//        name = "sc";
//        run();
//        System.out.println("go");
//
//    }
//    //代码运行会抛出异常,只是让看到能调用与不能调用
​
    public static void main(String[] args) {
        Student s1 = new Student();
         Student.age = 18;
         s1.name = "csc";
        System.out.println(s1.age);
        System.out.println(s1.name);
//        Student.run();
//        s1.go();
​
    }
}
package com.opp.opp14;
​
public class Person {
    //2.赋初始值
    {
        //代码块(匿名代码块)
        System.out.println("匿名代码块");
    }
    //1.只执行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.opp.opp14;
//静态导入包
import  static java.lang.Math.random;
public class Test {
    public static void main(String[] args) {
//      System.out.println(Math.random());经过静态导入包 可以直接输出random();   Math.random();生成随机数
        System.out.println(random());
    }
}
//如果一个类final定义了,则不能去继承这个类。final后,断子绝孙

抽象类与接口

抽象类

  • abstrat修饰符可以用来修饰方法也可以修饰类。

    如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类

  • 抽象类中可以没有抽象方法,但是有抽象方法的类,必须声明为抽象类

  • 抽象类,不能使用new关键字创建对象,它是用来让子类继承的

  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的

  • 子类继承抽象类,那么就必须要实现抽象类中没有实现的抽象方法,否则该子类也要声明为抽象类

package com.opp.opp15;
//abstract 抽象类:类        extends:单继承         接口:多继承
public abstract class A {
    //约束,有人帮我们实现
    // abstract 抽象方法    只有方法的名字,没有方法的实现!
    public abstract void doSomething();
    public void go(){
​
    }
    //1.不能new这个抽象类,只能靠子类去实现他;约束
    //2.抽象类中可以写普通方法
    //3.抽象方法必须写在抽象类中
    //抽象类可以叫做:抽象的抽象:约束~
}

子类

package com.opp.opp15;
//抽象类的所有方法,继承了它的子类,都必须实现它的方法~ 除非这个子类也是抽象类,则由它的子类的子类来实现它的方法
public class B extends A{
    @Override
    public void doSomething() {
​
    }
}

接口

  • 普通类:只有实现

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

  • 接口:只有规范,自己无法写方法~专业的约束!约束和实现分离:面向接口编程~

  • 接口就是规范,定义是一组规则,体现了现实世界种"如果你是。。。则必须。。。";eg:如果你是汽车,则必须会跑

  • 结构的本质就是契约,就像我们人间的法律一样。制定好后大家都遵守

  • OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计 模式都只针对具备了对象能力的语言

    (比如:c++, java ,c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。

    声明类的关键字是class 声明接扣的关键字是interface

    接口1:Action

    package com.opp.opp16;
    //interface 定义接口的关键字,接口都需要有实现类
    public interface Action {
    ​
        //属性默认的是一个常量    public static final     //一般不会在接口中定义属性
        int age = 18;
    ​
    ​
        //接口中所有定义的方法其实都是抽象的  public abstract
        void add();
        void delete();
        void update();
        void query();
    }

    接口2:TimeService

    package com.opp.opp16;
    ​
    public interface TimeService {
        void run();
    }

    类1:ActionImpl

    package com.opp.opp16;
    //抽象类:extends
    //类 可以实现接口 用implements 关键字连接接口(implements 接口1,接口2,...)  多继承
    //实现了接口的类,就必须重写接口中定义的方法
    //利用接口实现多继承
    public class ActionImpl implements Action,TimeService{
        @Override
        public void add() {
    ​
        }
    ​
        @Override
        public void delete() {
    ​
        }
    ​
        @Override
        public void update() {
    ​
        }
    ​
        @Override
        public void query() {
    ​
        }
    ​
        @Override
        public void run() {
    ​
        }
    }

    类2:ActionImpl1

    package com.opp.opp16;
    ​
    public class ActionImpl1 implements Action{
        @Override
        public void add() {
    ​
        }
    ​
        @Override
        public void delete() {
    ​
        }
    ​
        @Override
        public void update() {
    ​
        }
    ​
        @Override
        public void query() {
    ​
        }
    }

    一个接口可以继承多个接口

    一个类可以实现多个接口,

    一个类只能继承一个类,这就是JAVA的继承特点

  • 作用:

    1. 约束

    2. 定义一些方法让不用的类实现。如:10个人去实现一个事

    3. 定义的方法前默认有 public abstract (不会显示,但会存在)(定义方法:如:void add();)

    4. 定义的属性默认是一个常量,定义的属性前默认有public static final (不会显示,但会存在)

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

    6. implements可以实现多个接口

    7. 类继承接口后,必须重写接口中的方法

内部类

  • 内部类就是在一个类的内部定义一个类,比如:A类中定义了一个B类,那么B类相对于A类来说就称为内部类,

    而A类相对于B类就称为外部类

    1. 成员内部类

    2. 静态内部类

    3. 局部内部类

    4. 匿名内部类

成员内部类

package com.opp.opp17;
​
public  class Outer {
    private int age;
    private void out(){
        System.out.println("这是外部类");
    }
​
​
    public  class Inter{
        public void in(){
            System.out.println("这是内部类");
        }
        //获得外部类的私有属性
        public void getAge(){
            System.out.println(age);
        }
        //给外部类的所有属性赋值
        public void setAge(int age){
            Outer.this.age = age;
            System.out.println(age);
        }
        //获得外部类的方法
        public void getOut(){
            out();
        }
    }
}
package com.opp;  
import com.opp.opp17.Outer;
​
//一个项目中应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
Outer outer = new Outer();
        //通过外部类来实例化内部类
        Outer.Inter inter = outer.new Inter();
        inter.in();
        inter.getOut();
        inter.setAge(18);
​
    }
}

静态内部类

package com.opp.opp17;
​
public  class Outer {
    private int age;
    private void out(){
        System.out.println("这是外部类");
    }
​
​
    public static class Inter{
        public void in(){
            System.out.println("这是内部类");
        }
    }
}

局部内部类

package com.opp.opp17;
​
public class JuBu {
    public void run(){
        class Inner{
            public void in(){
                
            }
        }
    }
}

匿名内部类

package com.opp.opp17;
​
public class NinMing {
    public static void main(String[] args) {
        //没有名字初始化类,不用将实例保存到变量中。
        new A().eat();
        new Eat(){      //这里被隐藏了 Eat eat =      本来是:Eat eat = new Eat()
            @Override
            public void run() {
​
            }
        };
    }
}
class A {
    public void eat(){
​
    }
}
interface Eat{
    void run();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值