day01-面向对象-静态继承

2024-08-27 11:44

本文主要是介绍day01-面向对象-静态继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、static静态

static关键字:静态的意思,可以修饰成员变量、成员方法。

1.1 static修饰成员变量

成员变量按照有无static修饰,分为两种:1、类变量:有static修饰,属于类,随着类的加载而加载,在计算机中只有一份,会被类的所有对象共享方式1: 类名.类变量(推荐)eg: Student.name = "张三";方式2: 对象名.类变量(不推荐)eg: Student s1 = new Student();s1.name = "李四";2、实例变量:无static修饰,属于每个对象自己,,每个对象中都有一份对象名.实例变量eg:s1.age = 18;
​
总结类变量既可以使用类名调用,也可以使用对象名调用,推荐类名方式实例变量只能使用对象名调用

1什么场景下需要定义类变量

某个数据只需要一份,且希望能够被多个对象共享

2访问自己类中的类变量,是否可以省略类名不写?

可以的

注意:在某个类中访问其他类里的类变量,必须带类名访问

1.2 static修饰成员方法

成员方法的分类:
1、类方法有static修饰的方法,属于类,可以直接用类名访问,也可以用对象访问调用方式:类名.方法名()   [推荐]对象名.方法名() [不推荐]
​
2、实例方法无static修饰的方法,属于对象,只能用对象访问调用方式:对象名.方法名()
public class Demo1 {public static void main(String[] args) {//需求1: 类方法调用Student.print1();//需求2: 实例方法调用Student s1 = new Student();s1.print2();s1.print1();}
}
class Student {//编写一个类方法(使用Static修饰方法)打印hellopublic static void print1(){System.out.println("hello");}//编写一个实例方法(不使用Static修饰方法)打印HelloWorldpublic void print2(){System.out.println("HelloWorld");}
}

1类方法有啥应用场景?

可以用来设计工具类

2工具类是什么

工具类就是一些完整功能、经常使用的方法所在的类

3为什么工具类要用类方法,而不是用实例方法?

类方法可以不创建对象,直接调用,使用方便,节省内存

实例方法需要创建对象来调用,会浪费内存

4工具类定义时有什么建议?

工具类不需要创建对象, 建议将工具类的构造器私有化。

1.3注意事项

  • 类方法中可以直接访问类的成员,不可以直接访问实例成员。(static方法访问static的成员(变量和方法),不能访问非static的成员)

  • 实例方法中既可以直接访问类成员,也可以直接访问实例成员。(非static访问一切)

  • 实例方法中可以出现this关键字,类方法中不可以出现this关键字的。(static不能用this)

本质:this指的是对象静态的内容是跟随类加载而加载的, 此时还没有对象, 也就没有this和实例内容

1.4 (了解)代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为两种:静态代码块:格式:static { }特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。作用:完成类的初始化,例如:对类变量的初始化赋值。实例代码块:格式:{ }特点:每次创建对象时,执行实例代码块,并在构造器前执行。作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。
public class Demo {public static void main(String[] args) {//类加载System.out.println(Student.name);//1.加载Student 2.查找name属性并返回System.out.println(Student.name);System.out.println(Student.name);//对象创建Student student = new Student();Student student2 = new Student();}
}
​
class Student {//静态变量public static String name;
​//实例变量public int age;
​//静态代码块:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次, 可以用来对类变量进行初始化赋值static {System.out.println("执行static代码块");name = "莉莉";}
​//实例代码块:每次创建对象时,执行实例代码块,并在构造器前执行。{System.out.println("执行实例代码块");age = 18;}
​
}

static { }只执行一次,{ }每次创建对象都会执行。运行结果:

二、继承

2.1 概述

 Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。class B extends A{B类: 子类(派生类)A类: 父类(基类或者超类)}
​
继承的特点子类能继承父类的所有成员变量和方法,但不能直接访问父类的非私有成员变量和方法子类内部可以使用父类的非私有成员变量和方法
​
继承体系下类对象的创建子类的对象是由子类、父类共同完成的
public class Demo {public static void main(String[] args) {//继承下对象的创建: 子类的对象是由子类和父类共同完成的B b = new B();
​System.out.println(b.i);//System.out.println(b.j);//父类私有, 子类是无法直接使用的//System.out.println(b.k);//子类私有, 无法直接方法(封装的特点)
​b.print1();//b.print2();//父类私有, 子类是无法直接使用的b.print3();
​}
}
​
/*父类
*/
class A {
​//公有成员变量和方法public int i;public void print1(){System.out.println("父类中的print1方法");}
​//私有成员变量和方法private int j;private void print2(){System.out.println("父类中的print2方法");}
}
​
//使用extends关键字表明继承了A类
class B extends A{private int k;
​public void print3(){//父类的非私有的成员变量和方法,子类可以直接使用System.out.println(i);print1();
​
​//父类私有的成员变量和方法,子类可以继承到, 但是无法使用//System.out.println(b);//print2();}
}
继承的好处:减少了重复代码的编写,提高代码的复用性(将多个类中的重复代码向上抽取到父类中)

1.3 权限修饰符

用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围。
种类和作用private:    本类缺省:       本类、本包类protected:  本类、本包类、子孙类public:    任意类

1.4 单继承

Java中继承的特点Java只支持单继承,不支持多继承,但是支持多层继承为什么Java不支持多继承如果一个Java类继承了多个父类, 而多个父类中右恰好有一样的方法, 代码会产生冲突Object类Object类是Java中所有类的祖宗类,我们写的任何一个类,都是Object的子类或子孙类也就是说:java中所有的类都直接或间接的继承Object类(只要我们的类不明确使用extends继承类,那么它就默认继承Object)

1.5 方法重写

方法重写当子类觉得从父类中继承到的某个方法不好用,或者无法满足自己的需求时子类可以重写一个方法名称、参数列表一样的方法,去覆盖掉继承到的这个方法,这就是方法重写注意:重写后,方法的访问会遵循就近原则注意事项:1. 在重写的方法上标注Override注解,可以指定java编译器,检查我们方法重写的格式是否正确2. 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限( public > protected > 缺省 )3. 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。4. 私有方法、静态方法不能被重写,如果重写会报错的。应用场景重写toString来展示对象中的属性
public class Demo {public static void main(String[] args) {Son son = new Son();son.makeFriend();//结果:正在通过添加微信的方式交朋友~~~}
}class Father{//交朋友public Father makeFriend(){System.out.println("正在通过写信的方式交朋友~~~");return null;}
}class Son extends Father{//交朋友@Overridepublic Son makeFriend(){System.out.println("正在通过添加微信的方式交朋友~~~");return null;}
}

1.6 子类构造器特点

1.6.1 子类访问成员特点
父子类下访问成员的顺序1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。子类局部-->子类成员-->父类成员2、两个关键字强行访问子类的成员: this强行访问父类的成员: super
public class Demo {public static void main(String[] args) {Son son = new Son();son.show();}
}class Father {//父类成员int num = 10;
}class Son extends Father {//子类成员int num = 20;public void show() {//子类局部int num = 30;System.out.println(num);//30 就近原则System.out.println(this.num);//20 子类成员访问System.out.println(super.num);//10 父类成员访问}
}
1.6.2 子类构造器
子类构造器的特点子类的全部构造器,都会先调用父类的构造器,再执行自己。子类构造器是如何实现调用父类构造器的:默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有) ,它会调用父类的无参数构造器。如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父类的有参数构造器。
public class Demo {public static void main(String[] args) {Son son = new Son();}
}class Father{private String name;private int age;private String address;public Father() {System.out.println("调用Father无参数构造器");}class Son extends Father{private String school;public Son() {System.out.println("调用Son无参数构造器");}
}

public class Demo {public static void main(String[] args) {Son son = new Son();}
}class Father{private String name;private int age;private String address;public Father(String name, int age, String address) {this.name = name;this.age = age;this.address = address;System.out.println("调用Father有参数构造器");}
}class Son extends Father{private String school;public Son() {super("张三",20,"石家庄");System.out.println("调用Son无参数构造器");}
}

1.7 子类构造器应用

子类构造器调用父类构造器的应用场景我们经常在子类构造器中调用父类的有参构造器给父类传递参数来完成父类对象的初始化
public class Demo {public static void main(String[] args) {//需求: 使用Teacher的带参数构造创建对象,并对三个属性赋值Teacher teacher = new Teacher("李四",18,"C语言");System.out.println(teacher);}}class People {private String name;private int age;public People() {}public People(String name, int age) {this.name = name;this.age = age;}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;}
}class Teacher extends People {private String skill;public Teacher() {}public Teacher(String name, int age, String skill){super(name,age);this.skill = skill;}@Overridepublic String toString() {return "Teacher{" +"name='" + getName() + '\'' +", age=" + getAge() +", skill='" + skill + '\'' +'}';}}

1.8 this调用兄弟构造器

this()任意类的构造器中,是可以通过this(…) 去调用该类的其他构造器的。注意事项this(…) 、super(…) 都只能放在构造器的第一行,因此,有了this(…)就不能写super(…)了,反之亦然。
public class Demo {public static void main(String[] args) {//需求: 通过够全参构造创建对象并完成初始化Student student1 = new Student("张三", 18, "黑马程序员");System.out.println(student1);//需求: 如果用户没有指定学校, ,默认学校为"黑马程序员顺义校区"Student student2 = new Student("李四", 19);System.out.println(student2);}
}class Student {private String name;private int age;private String school;public Student(String name, int age, String school) {this.name = name;this.age = age;this.school = school;}public Student(String name, int age) {this(name, age, "黑马程序员顺义校区");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", school='" + school + '\'' +'}';}
}

这篇关于day01-面向对象-静态继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111572

相关文章

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

本地如何快速启动静态服务器

本地快速启动静态服务器 有许多第三方库可以帮助你快速启动一个静态服务器,甚至无需编写代码。通过命令行运行这些库后,它们会自动启动一个服务器并打开指定端口,展示当前目录下的文件内容: 电脑得提前安装NodeJS 1、http-server http-server 是一个轻量级的命令行工具,允许你快速启动一个静态文件服务器。 安装 npm install -g http-server

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

java基础总结15-面向对象11(抽象类)

下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();   从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里