Java十分钟精通类 封装 继承

目录
  • 什么是类成员
    • 什么是实例变量
    • 那么实例变量和类变量的区别呢?
    • 那么类方法和实例方法的区别?
    • static关键字
    • static成员方法:
    • static用处:
  • 封装:
    • 封装的概念
    • 封装的分类
    • 封装的使用
  • 继承:
    • 什么是继承
    • 继承的使用:
    • 方法重写的规则:
    • super关键字:

什么是类成员

使用static修饰的成员方法和成员变量称为类成员

使用static修饰的成员变量叫做类变量

使用static修饰的成员方法叫做类方法

什么是实例变量

未使用static修饰的成员方法和成员变量称为实例成员

未使用static修饰的成员变量叫做实例变量

未使用static修饰的成员方法叫做实例方法

例如:

public String name;  //这个就是实例成员(属性)
public static int age;//这个就是类成员(属性) 

public void a(){
	System.out.println("我叫:"+this.name)
}                                    //这个没有加static的方法就是实例方法

public static void a(){           	//这个加了static的方法就是类方法
	System.out.println("我叫:"+this.name)
}

那么实例变量和类变量的区别呢?

  • 所有该类的对象共享同一个类变量,但是每个对象都会有自己独特的实例变量
  • 所有该类的对象都能改变类变量的值,但是每个对象只能改变自己的实例变量值
  • 实例变量在使用前必须创建一个对象,根据对象名.变量名使用,但是类变量不需要创建对象
//定义一个类
public class stu {
    public String name;  //这个类有一个名字这个属性,属于实例成员,也就是需要实例化对象了才可以使用
    //定义构造方法
    public stu(){}    //不管怎么样,都定义一个无参构造
    public stu(String name){    //定义有参构造,需要传入一个字符串名字
       this.name = name;         //这里若不使用this 关键字,那么是不会与上面的实例属性匹配
    }
    //定义方法
    public void a(){
        System.out.println(this.name);
    }
}

使用该类:

public class stu_Test {
    public static void main(String[] args) {
        //实例化两个对象,基于stu类
        stu s1 = new stu("小红");
        stu s2 = new stu("小王");
        //使用stu类里面的方法
        s1.a();
        s2.a();
    }

    //stu s1 = new stu("小红");  将会输出小红
    //stu s2 = new stu("小王");  将会输出小王
}
//通过这个就可以明白每个对象都有属于自己的实例变量(属性)

那么类方法和实例方法的区别?

  • 所有该类对象共享类方法和实例方法
  • 类方法使用类名.方法名([参数])调用即可,不需要实例化对象后使用
  • 实例方法使用对象名.方法名([参数])调用

static关键字

Java类提供了两种类型的变量:用static关键字修饰的静态变量和不用static关键字修饰的实例变量。 静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别是“类.静态变量"和”对象.静态变量"

static成员方法:

  • static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用
  • static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。

static用处:

  • 修饰成员变量
  • 修饰成员方法
  • 静态代码块
  • 修饰类【只能修饰内部类也就是静态内部类】
  • 静态导包

static注意事项: 静态只能访问静态,非静态既可以访问非静态的,也可以访问静态的。

封装:

封装的概念

把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象进行操作,对不可信的类或者对象隐藏,这样的过程叫做封装。 简而言之:把自己的信息封闭起来,只给自己信任的人看和使用

封装的分类

  • 对属性的封装:将属性设置为private(私有),限制其只能在类的内部使用
  • 对方法的封装:对于方法的封装,将外部可以访问方法设置为public,将外部不能访问的方法设置为private

封装的使用

在将封装之前,我们先学习一下一个新的修饰符:private private:限制其只能在类的内部使用(也就是说被private修饰的方法和属性,只能在这个类内被发现和使用,在这个类外,是找不到这个属性的存在,这也达到了封装的效果)

//给name这个属性进行封装
private Strint name; //即可,这也我们在类外是找不到这个属性的存在的

既然封装了,肯定也有对这个封装进行修改和使用的方法,是的,这就是get/set方法

get/set方法

public class stu {
    private String name;
    public void setName(String name){    //set方法:对象调用这个方法,即可对私有属性进行修改
        this.name = name;
    }
    public String getName(){         //get方法:对象调用这个方法,就可以使用该方法
        return name;
    }
}

使用:

public class stu_Test {
    public static void main(String[] args) {
    stu s =new stu();
    s.setName("小红");  //给name 这个私有属性修改值为小红
        System.out.println(s.getName());

}  

//程序运行后,输出值就是小红

继承:

什么是继承

1:一个新类可以从现有的类派生,这样的过程叫做继承

2:在继承的过程中,新类被称为子类,现有的类被称为父类,子类将会继承父类的属性和行为。

继承语法:

public class stu extends Student{   //在类名后加上extends,在写上继承的父类即可
//这里可以写父类没有发属性及方法
	public String ID;  //等等等等

}

注意: 继承不能继承父类的私有属性和方法!!!只要被private修饰的,都不被继承!!!

关于子类: 子类除了可以拥有父类非私有的属性和方法外,也可以扩展自己的属性和方法

继承的使用:

  • 继承是单继承,也就是一个类只能有一个父类。
  • 如果一个类没有显式的继承某一个类,那么它有一个默认的父类是java.lang.Object类
  • 继承了父类非私有的成员变量和成员方法,但是请注意:子类是无法继承父类的构造方法的

简而言之:一个子类只能继承一个父类,如果这个类没有继承别的类,默认继承Object类(Java自带)

无法继承父类的构造方法。

方法的重写:

@overriding

什么是方法重写?:

  • 子类根据需求从父类继承的方法进行重新编写(方法名一样)
  • 重写是可以使用super方法的方式来保留父亲的方法(super在后面讲到)

注意:构造方法不能被重写

方法重写的规则:

  • 方法名相同,参数列表相同(数量,顺序,数据类型)
  • 如果有返回值,返回值相同或者是其子类,访问权限不能严于父类
  • 父类的静态方法不能被重写为非静态方法,反之父类的非静态方法不能被重写为静态方法
  • 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法**(静态方法中无法使用super、this)**
  • 父类的私有方法不能被子类重写(private修饰的)

上代码:

1:定义一个类,有名字和年龄的属性,分别有get/set方法,成员方法是输出名字和年龄:

public class Person {
    private String name;
    private int age;

    //get/ste方法
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    //成员方法:
    public void print(){
        System.out.println("我叫:"+this.name+","+"我今年:"+this.age+"岁");
    }
}

2:写一个类,继承Person类,并且这个类拥有自己的一个sex属性,提供get/set方法 并且重写父类的print方法,输出名字+年龄+性别

public class child extends Person{
    private String sex;      //这个child类继承了Person类,但也拥有自己的属性 sex性别
    public void setSex(String sex){
        this.sex = sex;
    }
    public String getSex(){
        return sex;
    }
    @Override
    //重写父类方法: 因为父类是输出名字和年龄,这里要输出名字,年龄和性别
    public void print(){
        System.out.println("我叫:"+getName()+","+"我今年:"+getAge()+"岁"+","+"我是"+sex+"孩子");
    }
}

3:新建测试类,测试两个类的继承、重写

//测试类,
public class Test {
    public static void main(String[] args) {
        child c = new child();
        c.setName("小红");
        c.setAge(20);
        c.setSex("男");
        c.print();
    }
}
//分别执行child继承person的set方法,使用重写后的方法,

//输出结果为: 我叫:小红,我今年:20岁我是男孩子

super关键字:

super代表的是父类对象

super的使用方式:

1:super.属性名 用于在子类中调用父类被隐藏的同名实例变量

2:super([参数列表]) 用于在子类的构造方法中调用父类的构造方法

注意事项:

  • 每一个子类的构造方法在没有显示调用super(),系统都会提供一个默认的super()
  • super() 书写在第一行
  • 可以在子类构造方法中显示调用super(),完成对特定父类构造方法的调用

简而言之:super就是调用父亲的属性和方法来使用

上代码:

1:新建一个类:定义age为20

public class super_test {
    public int age=20;
    public void print(){
        System.out.println(this.age);
    }
}

2:建第二个类,继承第一个类;

public class su2 extends super_test{
    public int age = 10;
    @Override
    public void print(){
        System.out.println(super.age);  //这里使用super,意思是使用父类的age
    }
}

3:建立测试类:

public class test {
    public static void main(String[] args) {
    su2 s = new su2();
    s.print();
	}
}

这样输出的就是20,是父类的age

this与super的区别:

  • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函 数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
  • this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的 形参与类中的成员数据同名,这时需用this来指明成员变量名
  • super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其 它构造方法。
  • super()和this()均需放在构造方法内第一行,尽管可以用this调用一个构造器,但却不能调用两个
  • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造 函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意 义,编译器也不会通过。
  • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括: static变量,static方法,static语句块。
  • 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

这篇博客比较长,需要慢慢消化,里面很多都是面试的高频题 bye

到此这篇关于Java十分钟精通类 封装 继承 的文章就介绍到这了,更多相关Java 继承 封装 类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 学生视角看Java 面向对象的继承本质

    1.什么是继承? (1)用来提高代码的复用性 (2)将相同的功能模块封装到方法中需要使用时调用方法达到代码复用的目的 (3)通过继承将多个类中的相同的类容摘取出来,变成一个新类,让其他类和当前的新类产生关系,达到代码复用性的目的 注意:Java是单继承与c++有区别 ,c++可以多继承. 2.继承的格式 关键字extends 3.继承的特性 *子类拥有父类非 private 的属性.方法. *子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. *子类可以用自己的方式实现父类的方法. *Ja

  • Java面向对象基础知识之封装,继承,多态和抽象

    目录 一.封装 二.继承 三.多态 四.抽象 总结 一.封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的.增加安全性 public class Person { private String name; private int gender; private int age; public String

  • 详解Java基础之封装

    目录 Java基础知识(封装) 封装 封装的目的 封装的好处 封装的步骤 封装的例子 总结 Java基础知识(封装) 封装 那封装是什么呢? 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装的目的 直接通过操控类对象来达到目的,不需要对具体实现十分了解,使类属性和方法的具体实现对外不可见.不但方便还起到了保护作用. 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段. 适当的封装可

  • 浅谈Java封装、继承、多态特性

    目录 1.封装 2.继承 3.多态 4.上代码,效果运行放在最后 1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量和方法),保护成员不被其他别的类来使用,如果需要被其他类来使用,那么需要提供对应的操作:a.提供get变量名()方法,用于获取成员变量的值 b.提供set变量名(参数),用于设置成员变量的值,同样也和get方法一样,都是用public

  • 一篇文章超详细的介绍Java继承

    目录 前言 继承 继承的优点 重写和隐藏父类方法 重写父类中的方法 隐藏父类中的方法 方法重写和隐藏后的修饰符 子类访问父类私有成员 使用super关键字 使用super调用父类的无参数构造方法/有参数构造方法 附:继承的使用和认识 总结 前言 继承是面向对象语法的三大特征之一.继承可以降低代码编写的冗余度,提高编程的效率.通过继承,子类获得了父类的成员变量和方法.一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢.今天我们开始学习有关Java继承的知识. 继承 继承就是子类

  • Java 封装的使用详解

    目录 1. 基本介绍 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 6. 将构造器和 setXxx 结合 7. 练习 1. 基本介绍 面向对象编程有三大特征:封装.继承和多态. 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 package com.xdr630.encap; public class Encapsulation01 { public static void main(String[] ar

  • Java由浅入深刨析继承

    目录 继承 继承的介绍 生活中的继承 继承的好处 继承的格式 继承的demo 子类不能继承的内容 super与this关键字 构造器不能被继承 final修饰的类不能被继承 方法重写 介绍 使用场景与案例 @Override重写注解 注意事项 完结 茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! Java基础知识(继承) 继承 继承的介绍 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.描述的是事

  • Java十分钟精通包装类的使用与操作

    包装类 何为包装类? 基本类型包装类的概述: 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 包装类是将基本数据类型的值包装为Java中的对象,Java语言为8种基本数据类型分别提供了包装类 首先看一下八大数据类型的包装类: 包装类型出现的原因: 因为Java是一个面向对象的语言,基本类型并不具有对象的性质,为了与其他对象"接轨"就出现了包装类型,它相当于将基本类型"包装起来",使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本

  • Java十分钟精通类 封装 继承

    目录 什么是类成员 什么是实例变量 那么实例变量和类变量的区别呢? 那么类方法和实例方法的区别? static关键字 static成员方法: static用处: 封装: 封装的概念 封装的分类 封装的使用 继承: 什么是继承 继承的使用: 方法重写的规则: super关键字: 什么是类成员 使用static修饰的成员方法和成员变量称为类成员 使用static修饰的成员变量叫做类变量 使用static修饰的成员方法叫做类方法 什么是实例变量 未使用static修饰的成员方法和成员变量称为实例成员

  • Java十分钟精通String类的各种使用方法

    String String类: 代表字符串,提供了开发中常用的字符串处理的方法,如:求字符串的长度.截取字符串.替换字符串等方法,符串是常量,它的值创建之后就不可以再修改了. 首先我们先查一下官方文档,看看官方给String类定了什么方法: String也是属于java.lang包,所以不需要导入,这里就部分展示,全部的内容可以参考: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.htm

  • Java十分钟精通内部类的使用

    内部类: 其实内部类顾名思义,就是类中类,一个类里面还有一个类. 内部类分为四种: 普通内部类 静态内部类 方法内部类 匿名内部类 我们一一去了解一下~~ A.普通内部类: 我们先通过代码去了解一下: package InternalClass; /** * 内部类 */ public class Car { public int a = 10; public int b = 20; //外部类的方法 public void method() { System.out.println("我是外部

  • Java十分钟精通多态与抽象类的使用与原理

    我们知道Java的三大特性:封装.继承.多态.前两个之前在Java入门(六)已经讲到,现在来讲多态这个特性. 什么是多态? 多态顾名思义即为多种形态的意思 Java中多态的含义: 发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息 子类对象的引用赋值给父类引用变量来实现动态的方法调用 Java中形成多态的前提: 继承 父类方法的重写 向上转型 我对多态的解释: 比如我们,是人,也是学生,也是年轻人,我可以用人的身份去做事情,也可以用学生的身份去买学生票,也可以用年轻人的身份做公益,这

  • Java十分钟精通集合的使用与原理上篇

    目录 什么是集合? 集合分为Collection和Map两种体系 一.Collection接口: 二.Map接口下分为HashMap和TreeMap: 集合总结: Collections工具类: 什么是集合? 比如我们去买超市买很多东西,我们不可能拿一样就去收银台,我们可能是先放到购物车内,然后再统一处理,所以购物车相当于一个容器,可以装很多东西,在Java中的集合也是相当于一个容器,可以装很多数据. 集合继承关系图: 但是这张图太复杂了,我们看一张简便的: 集合分为Collection和Map

  • Java十分钟精通异常处理机制

    目录 异常处理机制的底层原理 异常的继承关系图 异常的处理 一.try-catch-finally结构 二.多catch处理不同的异常: 三.throws声明异常/throw抛出异常: 四.自定义异常: 五.常见的异常 异常处理机制的底层原理 抛出异常,在执行一个方法时,如果发送了异常,则这个方法生成代表该异常的一个对象,停止当前执行的 路径,并把异常提交给jre. 捕获异常:jre得到该异常后,虚招相应的代码来处理该异常.jre在方法的调用栈中查找,从生成异常的 方法开始回溯,直到找到相应的异

  • Java十分钟精通接口的使用与原理

    何为接口? 官方解释: Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 个人理解解释: 其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成.接口是解决Java无法使用多继承的一种手段.我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法.反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重

  • Java十分钟精通Lambda表达式

    目录 1.简介 2.Lambda表达式的使用: 1.在普通方法内的使用 2.带参方法的使用 3.Lambda表达式实现多线程 4.Lambda表达式操作运算 5.Lambda表达式方法引用 6.Lambda表达式对集合的使用 3.总结 1.简介 首先Lambda表达式是属于Java8的 一个新特性,提供Java编程中对于函数式编程的支持,有助于代码的简洁,可以取代大半部分的匿名函数,尤其对于集合的遍历和集合的操作,极大的简化了代码. Lambda表达式的主体: 函数式接口: 注意: Lambda

  • Java十分钟精通泛型的使用与原理

    什么是泛型? 简而言之:<>泛型就是用来约束类.方法.属性上的数据类型,比如 List<Integer> list = new ArrayList<Integer>(); new ArrayList这个集合的元素只能添加Integer类型. 为什么需要泛型? Java推出泛型之前,程序员可以构建一个Object类型的集合,该集合能够存储任何的数据类型,而在使用该 集合的时候,需要程序员明确知道每个元素的具体的类型并向下转型,否则容易引发ClassCastExceptio

随机推荐