Java开发必备的三大修饰符
作者:北夷烟雪江中雨 发布时间:2021-10-19 10:11:01
标签:Java,修饰符
一、abstract 抽象的
抽象类:被abstract 修饰的类
语法: abstract class 类名{}
抽象方法 : 被abstract 修饰的方法
定义语法:
访问修饰符 abstract 返回值类型 方法名(参数列表);
abstract 访问修饰符 返回值类型 方法名(参数列表);
特点:
1.当一个类中存在抽象方法 那么这个类也必须是抽象的
2.一个抽象类中可以有抽象方法也可以有非抽象方法
3.如果一个类继承了抽象类,这个类如果不想成为抽象类,那么这个类必须实现抽象类中的所有抽象方法
4.抽象类不能创建对象,但是可以声明引用,抽象类的对象是存在的,是由子类创建子类对象时调用父类构造方法创建的,是无法自己手动去new 抽象类的对象的
抽象类的好处:强制使用多态
案例:
public class Demo{
public static void main(String[] args) {
}
}
abstract class Animal{
//抽象方法
public abstract void eat();
public abstract void sleep();
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃屎");
}
public void sleep(){
System.out.println("狗睡");
}
}
案例:
public class Demo{
public static void main(String[] args) {
Animal a = new Dog();
}
}
abstract class Animal{
public Animal() {
System.out.println("动物类的构造被调用 创建了 对象");
}
//抽象方法
abstract public void eat();
public abstract void sleep();
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃屎");
}
public void sleep(){
System.out.println("狗睡");
}
}
二、static 静态的
static修饰成员变量:类变量 静态变量 静态属性
定义语法:
访问修饰符 static 数据类型 变量名 = 变量值;
static 访问修饰符 数据类型 变量名 = 变量值;
访问的方式(特点)
1.类变量可以用 类名.属性名 访问
2.可以通过创建对象 用引用去访问 (不推荐)
案例:
public class Demo{
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);//10
System.out.println(t2.b);//21
}
}
class Test{
int a = 10;//实例变量
static int b = 20;//类变量
}
案例2:
public class Demo{
public static void main(String[] args) {
/*Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);
System.out.println(t2.b);*/
System.out.println(Test.b);//20
}
}
class Test{
int a = 10;//实例变量
static int b = 20;//类变量
}
static修饰成员方法: 静态方法
语法:
访问修饰符 static 返回值类型 方法名(形参列表){
方法的实现;
}
static 访问修饰符 返回值类型 方法名(形参列表){
方法的实现;
}
特点:
1.静态的方法中 不可以直接访问非静态的成员(成员变量 和 成员方法)
2.如果要访问非静态的成员 必须创建对象 通过引用取访问
3.静态方法可以通过 类名.方法名() 访问 也可以通过引用去访问(不建议)
4.静态的方法可以被继承 静态的方法不能被非静态的方法所覆盖 只能被静态方法覆盖 但是没有多态(引用是什么类型 调用的方法就是这个类型中的方法)
5.在静态方法中是不可以使用 this 和 super 关键字 因为 this 和 super都是和对象有关的 而静态的成员和对象无关 先于对象存在
案例:关于静态方法 访问非静态的成员
public class Demo{
public static void main(String[] args) {
/*Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);
System.out.println(t2.b);*/
//System.out.println(Test.b);//20
}
}
class Test{
int a = 10;//实例变量
static int b = 20;//类变量
//静态方法
public static void m1() {
m2();
//System.out.println(a);
}
//成员方法
public void m2() {
}
}
案例:关于 静态方法的使用 和 通过引用去访问非静态的成员
public class Demo{
public static void main(String[] args) {
//Test.m1();
Test t = new Test();
t.m1();
}
}
class Test{
int a = 10;//实例变量
static int b = 20;//类变量
//静态方法
public static void m1() {
Test t = new Test();
System.out.println(t.a);
t.m2();
}
//成员方法
public void m2() {
System.out.println("m2");
}
}
案例:关于 静态方法被继承
public class Demo{
public static void main(String[] args) {
/*Dog d = new Dog();
d.eat();*/
Dog.eat();
}
}
//定义动物类
class Animal{
public static void eat() {
System.out.println("动物吃");
}
}
class Dog extends Animal{
}
案例:关于 静态方法中是否能使用 this 和 super
public class Demo{
public static void main(String[] args) {
/*Dog d = new Dog();
d.eat();*/
//Dog.eat();
/*Animal a = new Dog();
a.eat();*/
Dog.eat();
}
}
//定义动物类
class Animal{
String sex = "狗妖";
public static void eat() {
System.out.println("动物吃");
}
}
class Dog extends Animal{
/*static String name = "金毛";
static int age = 3;*/
String sex = "母";//成员变量
public static void eat() {
String sex = "公"; //局部变量
System.out.println(super.sex);
/*System.out.println(name);
System.out.println(age);
System.out.println("狗吃");*/
}
}
初始代码块:定义在类中 方法外 用于在创建对象时 和 成员变量 按照从上向下的顺序执行初始化的操作 也叫做 动态代码块
语法:
{初始化代码块 }
案例:
public class Demo{
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.a);
System.out.println(t.b);
System.out.println(t.c);
}
}
class Test{
int a = 10;
int c;
int b;
{//初始化属性的
c = 30;
b = 20;
}
}
static 修饰初始化代码块:静态代码块
静态代码块的作用:在类加载时 和静态的属性 按照顺序执行 为类进行初始化操作
语法:
static{
}
案例:
public class Demo{
public static void main(String[] args) {
System.out.println(Test.a);
System.out.println(Test.b);
}
}
class Test{
static int a = 20;
static{
b = 40;
}
static int b;
}
注意:静态变量 时有默认值 先进行赋默认值 再初始化
==================================================================
类加载:当jvm第一次使用一个类时 需要通过classpath 找到.class = 字节码文件
读入这个类中的信息(包名 类名 属性 方法 静态的变量 静态的方法 。。。)并保存在虚拟机中 类加载只进行一次
类加载的时机:
1.创建对象时
2.类名访问静态成员(静态属性 静态方法)
3.子类进行类加载时 会先进行父类的类加载
案例:关于 1和2 两种情况类加载
public class Demo{
public static void main(String[] args) {
//1.创建对象
//Test t = new Test();
//2. 访问静态的成员
System.out.println(Test.a);
}
}
class Test{
static int a = 20;
static{
System.out.println("父类 类加载了");
}
}
案例:关于 3 情况的类加载
public class Demo{
public static void main(String[] args) {
//创建子类的对象
//Sub s = new Sub();
System.out.println(Sub.b);
}
}
class Test{
static int a = 20;
static{
System.out.println("父类 类加载了");
}
}
class Sub extends Test{
static int b = 30;
static{
System.out.println("子类进行类加载了");
}
}
三、final 最终的
修饰变量
局部变量:final修饰的局部变量只能赋值一次 值一旦赋值不可以改变
常量的定义:
public static final double PI = 3.14159265457;
案例:
public class Demo{
public static void main(String[] args) {
int a = 20;//局部变量
final int b = 10;
a++;
b++;
System.out.println(a);
System.out.println(b);
}
}
public class Demo{
public static void main(String[] args) {
final int a ;//声明
a = 10;
a = 20;//报错
System.out.println(a);
}
}
实例变量
特点:
1.final修饰的实例变量没有默认值
2.final修饰的实例变量只能赋值一次
3.final修饰的实例变量可以在构造方法中初始化 但是要保证每个构造都必须能够为这个变量初始化
案例:
public class Demo{
public static void main(String[] args) {
Animal a = new Animal(250);
//System.out.println(a.a);//0
System.out.println(a.b);
}
}
class Animal{
/*int a = 10;//实例变量
final int b = 20;*/
int a;
final int b = 20;
public Animal(int b) {
this.b = b;
}
}
public class Demo{
public static void main(String[] args) {
Animal a = new Animal(250);
//System.out.println(a.a);//0
System.out.println(a.b);
}
}
class Animal{
/*int a = 10;//实例变量
final int b = 20;*/
int a;
final int b ;
public Animal(int b) {
this.b = b;
}
public Animal() {
b = 30;
}
}
类变量
特点:
1.final修饰的类变量没有默认值
2.final修饰的类变量可以通过静态代码块进行初始化
案例:
public class Demo{
public static void main(String[] args) {
System.out.println(Animal.a);
System.out.println(Animal.b);
}
}
class Animal{
static int a ;
final static int b ;
static{
b = 250;
}
}
修饰方法
成员方法:
特点:
1.final修饰的成员方法可以重载
2.final修饰的成员方法不可以被覆盖
语法:
public final void m1() {
}
final public void m1() {
}
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Animal{
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public final void m1() {
System.out.println();
}
}
静态方法:
特点:
1.final修饰的静态方法可以重载
2.final修饰的静态方法不可以被覆盖
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Animal{
public final static void m1() {
System.out.println("m1");
}
public final static void m1(int a) {
System.out.println("m1");
}
}
class Dog extends Animal{
}
修饰类
语法:
final class Animal{
}
特点:final修饰的类没有子类 俗称断子绝孙类
jdk的类库中有哪些final修饰的类?
String Math System
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Dog extends System{
}
四、关于修饰符混搭的原则
class Animal{
public final static void m1() {
System.out.println("m1");
}
public final static void m1(int a) {
System.out.println("m1");
}
}
class Dog extends Animal{
}
##### 修饰类
```java
语法:
final class Animal{
}
特点:final修饰的类没有子类 俗称断子绝孙类
jdk的类库中有哪些final修饰的类?
String Math System
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Dog extends System{
}
五、关于修饰符混搭的原则
来源:https://blog.csdn.net/qq_40828705/article/details/117414791


猜你喜欢
- 1 什么是class对象类是程序的一部分,每个类都有一个class对象。换言之,每当编写并且编译了一个新类,就会产生一个class对象(更恰
- 从SD卡中获取图片资源,或者拍一张新的图片。 先贴代码 获取图片: 注释:拍照获取的话,可以指定图片的保存地址,在此不说明。 CharSeq
- 需求分析需求一:图片列表查询,从后台返回数据,将数据展示在页面上需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印说明:此次案例的
- 在使用微服务中,单体事务注解@Transactional 就不适用了,需要采用分布式事务解决方案,本文介绍分布式事务Seata的安装。Sea
- 方法的递归调用1. 基本介绍:简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁
- 在Scala中调用java的方法,很简单,直接导入传递参数就可以进行调用了.在Java中调用Scala的方法呢?经过测试,也是很简单,静态方
- 今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源。搜集一些c#操作excel的程序。步骤如下:下载一个Micr
- 本文实例讲述了C#信号量用法。分享给大家供大家参考,具体如下:using System;using System.Collections.G
- Java当中的类和对象1. 类和对象的初步认知java 是一门面向对象的语言,所谓面向对象有别于面向过程,面向对象是只需对象之间的交互即可完
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 一、系统介绍1.开发环境开发工具:Eclipse2021JDK版本:jdk1.8Mysql版本:8.0.132.技术选型Java+Swing
- 本文最终结果大概是这样的,使用java技术随机生成10个数,然后填充一个数组并在消息框中显示数组内容,接着对数组求和输出,将结果显示在消息框
- 自定义对象作为HashMap的Key这个问题在很多面试者面试时都会被提及,本人也是最近在看effective java第九条:覆盖equal
- 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵
- 我们先要记住三者的特征:String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线
- 1.创建一个带Mesh的物体Unity中的网格作为组件不能脱离物体单独存在新建脚本CreateMeshpublic class Create
- 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word成功了;但是导出pdf相对麻烦了一点。两天的研究测试java导出
- 前言Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。尤其是其事务日志,每次处理事务请求时都需要将其
- 1. Java对象结构Java对象结构包括三部分:对象头、对象体和填充字节,如图所示:对象头又包括三个字段:第一个字段叫作Mark Word
- 在upload.jsp页面中将多个文件域对象命名为相同的名字,这样在action中就可以将多个文件域解析成一个数组,数组的大小就是文件域的个