Java核心技术 类

类与对象

对象

世间万物皆可称之为对象,每个对象都是独立的个体,拥有自己的属性和行为。多个对象相互联系、交流、影响构成世界。

Java世界中对象的映射,可以想象类就是对象在游戏世界的角色。

Java面向对象编程

用Java类描述真实的对象,赋予类各种属性和方法,描述对象之间的关系,最终完成对真实世界的映射!

三大特性:封装、继承、多态。

JavaBean类标准形式

package CsdnPackage;

public class JavaClass {
    //私有的字段变量
    private String name;
    private int id;

    //重载的构造器
    public JavaClass() {

    }

    public JavaClass(String name, int id) {
        this.name = name;
        this.id = id;
    }

    //Getter和Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    //我们自己的方法
    public void ok() {
        System.out.println("Our Method");
    }
}

封装

概念

将类的内部细节隐藏起来,对外只提供某些接口,以完成功能任务。

可以联想真实世界中的每个人,都具有自己的个性、能力、特点,但第一次见面无法知道其特征,随着慢慢交流,其特征慢慢展现。我们就可以一起合作完成任务,例如,我叫他帮我买瓶水,我只需要给他钱和水的名称就好,不需要多余的指令,他自己就会完成该任务。

为什么要进行封装

封装可以保证我们想存留的属性数据不会被胡乱修改,如果某类的属性数据没有封装,那么其他类就可以在其不知情的情况下对他的属性数据进行操作,这种感觉是及其不安全的!

Java以权限体现

权限范围
private当前类可访问
default同包可访问
protected同包和子类可访问
public都可访问
package CsdnPackage;

import java.util.Date;

/*
 * private 修饰的属性是我们想隐藏的内心
 * public 修饰的方法是我们对外开放的接口,外界可以通过public的接口让我们完成某些任务
 * */
public class PrivateClass {
    //字段属性定义基础形式: 权限  类型  字段名
    private String name;
    private int age;
    private Date birthday;

    /*
     * 构造器:犹如创造一个机器人,并赋予其天生的某些属性
     * 形式: 权限 类名(接收参数可有可无){
     *   ...
     * }
     * */

    public PrivateClass() {
    }

    public PrivateClass(String name, int age, Date birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    /*
     * 方法定义基础形式:权限 返回值类型 方法名(接收参数可有可无){
     *    ...
     * }
     * getXXX和setXXX方法:犹如后天对属性进行更改设置,以及外界对我们的内心进行了解
     * */

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

继承

概念

在现有类的基础上构建一个新类。新类称为子类,现有类成为父类,子类会拥有父类中可以继承的属性和方法。

真实世界中继承很常见,像我们和父母的关系一样,我们可以继承父母的财产、事业。

好处

可以利用现有类快速构建新类,并且新类可以有独特的方法以完成特别的任务。

Java以关键字extends体现

package CsdnPackage;

//内部类的定义之后会说
class Father {
    private String name;
    private int age;

    public Father() {
    }

    public void fatherSay() {
        System.out.println("Father Say Hello");
    }

}

class Son extends Father {
    private String name;
    private int age;

    public Son() {
    }

    public void sonSay() {
        System.out.println("Son Say Hi");
    }
}

public class ExtendsClass {
    public static void main(String[] args) {
//新建类的实例,new 类的构造器;
        Son son = new Son();
//Son类型中并未定义fatherSay()方法,但却可以调用,这便是继承的意义,父类可继承的属性和方法都隐式的存在于子类中!
        son.fatherSay();
//子类也会有自己独立的特性。
        son.sonSay();
    }
}

多态

概念

一个类型的某些对象对于共同的动作会有不同的反应形式,而Java为把这种现象描述出来创建了多态这一概念。

好处

消除了类之间的耦合关系,可以提高性能和维护性。

Java以创建对象时左父右子体现

package CsdnPackage;

class Animal {
    String name = "animal";
    int age = 19;

    public void song() {
        System.out.println("nononon");
    }
}

class Dog extends Animal {
    String name = "dog";
    int age = 17;

    @Override
    public void song() {
        System.out.println("wang wang wang");
    }
}

class Cat extends Animal {
    String name = "cat";
    int age = 20;

    @Override
    public void song() {
        System.out.println("miao miao miao");
    }
}

public class PolymorphismClass {
    public static void main(String[] args) {
//创建对象时左边类型是父类型,右边类型是子类型,以此来体现多态
        Animal animalDog = new Dog();
        System.out.println("Animal name:" + animalDog.name + " age:" + animalDog.age);
        animalDog.song();
//从输出可以看出多态的成员变量都是父类型的值,而方法都是子类型的。因此多态是描述同类型不同对象对同一事件的不同反应
        Animal animalCat = new Cat();
        System.out.println("Animal name:" + animalCat.name + " age:" + animalCat.age);
        animalCat.song();
    }

}

内部类

概念

在类中的类,可以看成一个盒子类装了许多其他的类。

形式

静态内部类、匿名内部类、局部内部类、成员内部类。

Java体现

  1. 成员内部类

    package CsdnPackage;
    
    
    public class InnerClass {
    
        //成员内部类,就是可以当作成员变量使用的内部类
        class Circle {
    
            double radius = 0;
    
            public Circle(double radius) {
                this.radius = radius;
            }
    
            //可以一直嵌套成员内部类
            class Draw {
                double radius = 0;
            }
    
    
        }
    
        public static void main(String[] args) {
    
            //创建时首先建最外部的类,然后一步步往下建
            
            InnerClass first = new InnerClass();
    
            //内部类的命名是外部类.内部类。new的时候是已存在的外部类.new 内部类()
            InnerClass.Circle second = first.new Circle(2);
    
            InnerClass.Circle.Draw third = second.new Draw();
            System.out.println(second.radius + " " + third.radius);
    
        }
    }
    
  2. 局部内部类

    package CsdnPackage;
    
    public class InnerClass {
    
        public void ok() {
            System.out.println("Hello");
    //局部内部类,就是类放在方法体里,其作用域也仅限于方法体内
            class Home {
                private int a = 11;
    
                public void write() {
                    System.out.println(a);
                }
            }
            Home home = new Home();
            home.write();
        }
    
        public static void main(String[] args) {
            InnerClass inClass = new InnerClass();
    //    InnerClass.Home home=inClass.new Home();会报错,因为inClass对象无法直接访问到内部类
            inClass.ok();
    
        }
    }
    
  3. 静态内部类

    package CsdnPackage;
    
    public class InnerClass {
        //静态内部类,可以突破先外类后子类的创建方式
        static class N {
            private int i = 0;
    
            public void write() {
                System.out.println(i);
            }
        }
    
        public static void main(String[] args) {
    //创建时类型外类.子类 = new 外类.子类()
            InnerClass.N in = new InnerClass.N();
            in.write();
        }
    }
    
  4. 匿名内部类

    package CsdnPackage;
    
    interface A {
        void shout();
    }
    
    public class InnerClass {
        public static void aShout(A a) {
            a.shout();
        }
    
        public static void main(String[] args) {
            String name = "XX";
    //匿名内部类,直接通过new创建并使用,并不用命名,一般用于接口的实现
            aShout(new A() {
                public void shout() {
                    System.out.println(name);
                }
            });
        }
    }
    

抽象类和接口

概念

抽象类

在现实生活中有很多东西是抽象的,他可以代表某类具有相同特性的群体,在某个特定的时刻他可以是该出现在那个位置的物件。

Java利用抽象进行描述,抽象的东西不需要写出具体的过程,只需要定义基本信息即可。

package CsdnPackage;

class A1 extends AbstractClass{

    @Override
    public void abstractWrite() {
        System.out.println("A1方式输出");
    }
}

class A2 extends AbstractClass{

    @Override
    public void abstractWrite() {
        System.out.println("A2方式输出");
    }
}

//抽象类无法进行实例化,抽象类是为了描述某些对象的共同特性而存在
public abstract class AbstractClass {

    private String name;
    private int id;

    public void write() {
        System.out.println("普通方法输出");
    }
//抽象方法必须放在抽象类中,该方法适应性极强,谁用他谁重写就行
    public abstract void abstractWrite();

    public static void main(String[] args) {
        A1 a1 = new A1();
        A2 a2 = new A2();
        a1.abstractWrite();
        a2.abstractWrite();
    }
}

接口

内部的行为都是抽象的类称为接口,接口与类之间的继承称为实现,用implements关键字完成该操作,接口之间同样用extends来继承。接口出现的原因很大一部分是为了补足Java单继承的缺陷。

package CsdnPackage;

//纯粹的抽象,所有东西都是为了描述共同特性,不夹带一点私货
interface Action1 {

    public String name = "我是接口的变量,我是final+static修饰的,所以我必须在出生的同时拥有值  ";

    //接口的方法是抽象的
    public void interfaceWrite();

}

interface Action2 {
    public int id = 1;
}

//可以利用接口同时拥有多个类型的特征
public class InterfaceClass implements Action1, Action2 {

    @Override
    public void interfaceWrite() {
        System.out.println("重写接口中的抽象方法");
    }

    public static void main(String[] args) {
        InterfaceClass interfaceClass = new InterfaceClass();
        interfaceClass.interfaceWrite();
        System.out.println(interfaceClass.name + interfaceClass.id);
    }
}

类的常见关键字和方法技巧

  1. 重载和递归

    方法的重载就是接收参数的类型、类型个数和顺序不同,方法名参数等都相同时都被允许存在,其目的就是更好的处理从外界接收到的复杂信息。

    package CsdnPackage;
    
    public class MethodsClass {
    //方法的重载是指只有接收参数和权限可以不同,其他相同的同名方法。
        public void add(int i,int j){
            System.out.println(i+j);
        }
        public void add(int i,double j){
            System.out.println(i+j);
        }
        public void add(double j,int i){
            System.out.println(i+j);
        }
        public void add(int i,int j,int k){
            System.out.println(i+j+k);
        }
        public void add(int i,int j,String a){
            System.out.println(i+j+a);
        }
    
        public static void main(String[] args) {
            int i=10;
            int j=20;
            int k=30;
            double l=30.5;
            String a="Hi";
    
            MethodsClass methodsClass = new MethodsClass();
            methodsClass.add(i,j);
            methodsClass.add(i,j,k);
            methodsClass.add(i,j,a);
            methodsClass.add(i,l);
    
        }
    }
    

    方法的递归就是利用某个可以停下来的条件,然后不停的调用自己。

    package CsdnPackage;
    
    public class MethodsClass {
        public static int sumAdd(int n) {
    //判断条件,当最后一次时返回0
            if (n < 0)
                return 0;
    //每次都调用自身,实际上的运作顺序就是sumAdd(9)+10,sumAdd(9)内部就是sumAdd(8)+9,依次深入知道小于0递归结束        
            return sumAdd(n - 1) + n;
    
        }
    
        public static void main(String[] args) {
    
            System.out.println(sumAdd(10));
        }
    }
    
  2. 关键字

NameValue
代指本类this
静态static
代指父类super
最终final
package CsdnPackage;

class FatherClass{
//final最终修饰的变量不可以重新赋值,static修饰的变量可以直接利用类名.变量名使用
    public static final int id=99;
    public void fatherWrite(){
        System.out.println("父类输出");
    }
//final修饰的方法不可以重写
    public final void finalMethod(){
        System.out.println("final方法不可重写");
    }
}
public class KeywordsClass extends FatherClass{
//当类第一次执行时自动执行,但也执行一次
    static {
        System.out.println("静态代码块执行");
    }
    public void sonWrite(){
        System.out.println("子类输出");
    }
//静态修饰的方法和变量可以利用类名和方法名直接调用,无需创建实例对象
    public static void hello(){
        System.out.println("静态方法调用类名.方法名");
    }

    public void useWrite(){
//super代表父类,可以利用super调用父类的方法变量等
        super.fatherWrite();
        System.out.println(super.id);
//this代表本类,可以利用this调用本类的方法变量等
        this.sonWrite();
    }

    public static void main(String[] args) {
        KeywordsClass.hello();
        System.out.println(FatherClass.id);
        KeywordsClass keywordsClass = new KeywordsClass();
        keywordsClass.useWrite();
    }
}

总结

类是Java核心中的核心,本文只是粗略对基础进行介绍,还有很多类的知识要进行学习,读者可以自行寻找,但一定要打好基础,把类学好学明白!

Author
小葳宝贝最爱吃饭
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小葳宝贝最爱吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值