第8天 静态函数、main方法、单例模式、instanceof
来源:互联网 发布:手机录入软件 编辑:程序博客网 时间:2024/06/08 08:35
1.复习
构造函数:
构造函数的作用: 初始化对应的对象。
构造函数的格式:
修饰符 函数名(形式参数){
函数体
}
构造函数要注意的事项:
1. 构造函数是没有返回值类型的。
2. 构造函数的函数名是必须与类名一致。
3. 构造函数不是由我们手动调用的,是我们在创建了对应的对象时,jvm会根据你创建的对象传递的参数调用
对应 的对象。
4. 如果一个类没有显示写上一个构造函数的时候,那么java编译器会为该类添加一个无参 的构造函数。
5. 如果一个类已经显示写上一个构造函数的时候,那么java编译器则不会再为该类添加一个无参 的构造函数。
6. 构造函数是可以以函数重载的形式存在多个。
构造代码块:
构造代码块的作用:给对象进行统一的初始化。
构造代码块 的格式:
{
代码;
}
构造代码块是在创建了代码块所属类的对象时调用一次。
this关键字:
this关键字代表了所属函数的调用者对象。
this关键字的作用:
1. 一个类中存在同名的成员变量与局部变量时,在方法的内部默认是访问局部变量的,可以通过this关键字指定访问成员变量 的数据。
2. this关键字还可以在构造函数中调用另外一个构造函数初始化对象,
this关键字调用构造函数要注意的事项:
1. this关键字调用其他 的构造函数时,必须要是在第一个语句。
2. this关键字调用构造函数时不能出现相互调用,因为是一个死循环。
3. 如果在方法的内部访问一个变量时,该变量只存在于成员变量中,局部没有没有,这时候java编译器会为该变量的前面添加this关键字。
static(静态、修饰符)
static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据.
2.静态函数
1)静态成员变量的访问方式:
方式一: 使用对象进行访问。
对象.属性名
方式二:可以使用类名进行访问。
类名.属性名
注意:
1. 非静态成员变量不能类名直接访问,只能使用对象进行访问。
2. 千万不要为了方便访问成员变量而使用static修饰,一定要是该数据是共享数据 时才使用static修饰。
2)static修饰方法(静态的成员方法)
访问方式:
方式一:可以使用对象进行访问。
对象.静态的函数名();
方式二:可以使用类名进行访问。
类名.静态函数名字。
推荐使用是类名直接访问静态的成员。
3)静态的成员变量与非静态成员变量的区别
1.作用上的区别:
a) 静态的成员变量的作用共享一个数据给所有的对象使用。
b) 非 静态的成员变量的作用是描述一类事物的公共属性。
2.数量与存储位置上的区别:
a)静态成员变量是存储方法区内存中,而且只会存在一份数据。
b)非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
3.生命周期的区别:
a)静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
b)非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。
4)静态函数要注意的事项
1.静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
2.静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,而非静态的成员数据是随着对象 的存在而存在的。
3.非静态的函数是可以直接访问静态与非静态的成员。
原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态数据也随着对象的创建而存在了。
4.静态函数不能出现this或者super关键字。
原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this关键字是代表了一个函数 的调用者对象,这时候产生了冲突。
静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。
5)static什么时候修饰一个函数
如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了。 一般用于工具类型的方法
6)静态函数不能访问非静态成员?
静态函数只要存在有对象,那么也可以访问非静态的数据。只是不能直接访问而已。
7)静态函数代码实例
<span style="font-family:Microsoft YaHei;font-size:12px;">class Student{String name; //名字staticString country = "中国"; //国籍//静态代码块 :静态代码块是在Student.class文件加载到内存的时候就马上执行的。static{System.out.println("静态代码块执行了...");}//构造函数public Student(String name){this.name = name;}//非静态的成员函数public void study(){System.out.println("好好学习"+this);}//静态函数public static void sleep(){ //静态方法与非静态方法的字节码文件是同时存在内存中 的。 只是静态的成员变量数据是优先于对象存在而已。Student s= new Student("铁蛋");System.out.println(s.name+"呼呼大睡...");}}class Demo2 {public static void main(String[] args) {Student.sleep();//Student s = new Student("狗娃");}}</span>
3.main方法的详解
主函数是静态的
public static voidmain(String[] args){
}
ü public:公共的。 权限是最大,在任何情况下都可以访问。 private
原因: 为了保证让jvm在任何情况下都可以访问到main方法。
ü static: 静态。静态可以让jvm调用main函数的时候更加的方便。不需要通过对象调用。
ü void: 没有返回值。 因为返回的数据是 给 jvm,而jvm使用这个数据是没有意义的。所以就不要了。
ü main:函数名。 注意:main并不是关键字,只不过是jvm能识别的一个特殊的函数名而已。
ü arguments:担心某些程序在启动需要参数。
4.单例设计模式
模式:模式就是解决一类 问题的固定步骤 。
软件行业中的23种设计模式,其中常见的有
ü 单例设计模式
ü 模板设计模式
ü 装饰者设计模式
ü 观察者设计模式
ü 工厂设计模式
单例设计模式:保证一个类在内存中只有一个对象。
饿汉单例设计模式
1. 私有化构造函数。
2. 声明本类的引用类型变量,并且使用该变量指向本类对象。
3. 提供一个公共静态的方法获取本类的对象。
a)饿汉单例设计模式 ----> 保证Single在在内存中只有一个对象。
<span style="font-family:Microsoft YaHei;font-size:12px;">class Single{//声明本类的引用类型变量,并且使用该变量指向本类对象private staticSingle s = new Single();//私有化构造函数private Single(){}//提供一个公共静态的方法获取本类的对象publicstatic Single getInstance(){return s;}}</span>
b)懒汉单例设计模式
1. 私有化构造函数。
2. 声明本类的引用类型变量,但是不要创建对象,
3. 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象
,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,
然后再返回。
懒汉单例设计模式 ----> 保证Single在在内存中只有一个对象。
<span style="font-family:Microsoft YaHei;font-size:12px;">class Single2{//声明本类的引用类型变量,不创建本类的对象private static Single2 s;//私有化了构造函数private Single2(){}public static Single2 getInstance(){if(s==null){s = new Single2();}return s;}}</span>
推荐使用: 饿汉单例设计模式。 因为懒汉单例设计模式会存在线程安全问题,目前还不能保证一类在内存中只有一个对象。
5.继承
1:描述一个学生类
1:姓名年龄学号属性,学习的方法
2:描述一个工人类
1:姓名年龄工号属性,工作的方法
3:描述一个人类
1:姓名年龄属性,说话的方法。
4:发现学生类和人类天生有着联系,学生和工人都是人。所以人有的属性和行为学生和工人都会有。出现类代码重复
<span style="font-family:Microsoft YaHei;font-size:12px;">class Person {String name;int age;// 静态变量(类变量)对象和对象之间的代码重复使用静态变量static String country = "CN";Person() {}void speak() {System.out.println(name + ":哈哈,我是人!!!");}}// 让学生类和人类产生关系,发现学生is a 人,就可以使用继承class Student {String name;int age;Student() {}void study() {System.out.println("姓名:" + name + "年纪:" + age + ":好好学习");}}class Worker {String name;int age;void work() {System.out.println(name + ":好好工作,好好挣钱。");}}class Demo1 {public static void main(String[] args) {Student s = new Student();s.name = "jack";s.age = 20;s.study();Worker w = new Worker();w.name = "rose";w.work();}}</span>
5:问题:
1:如果没有继承,出现类和类的关系无法描述
2:如果没有继承,类和类之间有关系会出现类和类的描述代码的重复。
6.继承的特点
ü 描述类和类之间的关系
ü 降低类和类之间的重复代码
ü 降低对象和对象之间的代码重复使用静态变量
ü 降低类和类之间的代码重复使用就继承
继承:继承是通过关键字extends体现的。
继承的格式:
class 类名1 extends 类名2{
}
7.继承的细节
n 类名的设定,被继承的类称之为父类(基类),继承的类称之为子类
n 子类并不能继承父类中所有的成员
ü 父类定义完整的成员 静态成员,非静态,构造方法。静态变量和静态方
ü 法都可以通过子类名.父类静态成员的形式调用成功。
u 所有的私有成员不能继承,private修饰的成员。
u 构造函数不能被继承
8.如何使用继承
ü 不要为了使用继承而继承。工人和学生都有共性的成员,不要为了节省代
9.继承需要注意的事项
ü 千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承。
ü 父类私有的成员不能被继承。
ü 父类的构造函数不能被继承。
ü 创建子类对象时默认会先调用父类无参的构造函数。
10.继承代码实例
<span style="font-family:Microsoft YaHei;font-size:12px;">class Person{String name;privateint age;public Person(String name){this.name = name;}public Person(){System.out.println("Person类的构造方法被调用了....");}public void eat(){System.out.println(name+"在吃饭...");}}//学生类class Student1 extends Person { // Student 就称作为Person类的子类, Person类就称作为Student的父类(超类、基类)int num; //学号public Student1(){System.out.println("Student类的构造方法被调用了....");}public void study(){System.out.println(name+"good good study , day day up");}}class Demo7 {public static void main(String[] args) {Student1 s = new Student1();s.name = "狗娃";System.out.println("名字:"+ s.name);s.eat();}}</span>
6.super关键字、方法的重写
super关键字:
super关键字代表了父类空间的引用。
super关键字的 作用:
1. 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
2. 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
super关键字调用父类构造方法要注意的事项:
1. 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
2. super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
3. super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
super关键字与this关键字的区别:
1. 代表的事物不一致。
1. super关键字代表的是父类空间的引用。
2. this关键字代表的是所属函数的调用者对象。
2. 使用前提不一致。
1. super关键字必须要有继承关系才能使用。
2. this关键字不需要存在继承关系也可使用。
3. 调用构造函数的区别:
1. super关键字是调用父类的构造函数。
2. this关键字是调用本类的构造函数。
<span style="font-family:Microsoft YaHei;font-size:12px;">class Fu{int x = 10;String name;public Fu(){System.out.println("Fu类无参的构造方法..");}public Fu(String name){this.name = name;System.out.println("Fu类带参的构造方法..");}public void eat(){System.out.println("小头爸爸吃番薯..");}}class Zi extends Fu{int x = 20; int num;public Zi(String name,int num){super(name); //指定调用了父类带参的 构造方法...this(); // 调用本类无参构造方法..//super(); //指定调用了父类无参构造方法。。。System.out.println("Zi类带参的构造方法..");}public Zi(){System.out.println("Zi类无参的构造方法..");}public void print(){System.out.println("x = " +super.x);public void eat(){System.out.println("大头儿子吃龙虾..");}}class Demo9 {public static void main(String[] args) {Zi z = new Zi("狗娃");}}</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">/*目前的问题:父类的功能无法满足子类的需求。方法重写的前提: 必须要存在继承的关系。方法的重写: 子父类出了同名的函数,这个我们就称作为方法的重写。什么是时候要使用方法的重写:父类的功能无法满足子类的需求时。方法重写要注意的事项:1.方法重写时, 方法名与形参列表必须一致。2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。Exception(最坏)RuntimeException(小坏)方法的重载:在一个类中 存在两个或者两个 以上的同名函数,称作为方法重载。方法重载的要求1. 函数名要一致。2. 形参列表不一致(形参的个数或形参 的类型不一致)3. 与返回值类型无关。*/class Animal{ //大的数据 类型 }class Fish extends Animal{ //Fish小 的数据类型。}class Fu{String name;public Fu(String name){this.name = name;}public Animal eat() throws RuntimeException {System.out.println(name+"吃番薯...");return new Animal();}}class Zi extends Fu{String num;public Zi(String name){super(name);//指定调用 父类带参的构造方法}//重写父类的eat方法public Animal eat() throws Exception{System.out.println("吃点开胃菜..");System.out.println("喝点汤....");System.out.println("吃点龙虾....");System.out.println("吃青菜....");System.out.println("喝两杯....");System.out.println("吃点甜品....");return new Animal();}}class Demo10{public static void main(String[] args) {Zi z = new Zi("大头儿子");z.eat();}}</span>
7.继承练习
需求:使用java描述一下普通的学生、 java基础班的学生、 就业班的学生。
所有的学生都会学习。但是学习的内容不一样。
普通 的学生: 马克思列宁主义。
基础班的学生:学习的是 javase。
就业班学生: javaee+android.
//普通的学生类
<span style="font-family:Microsoft YaHei;font-size:12px;">class Student{String name;//构造函数public Student(String name){this.name = name;}public void study(){System.out.println(name+"学习马克思列宁主义");}}//基础班的学生是属于学生中一种class BaseStudent extends Student{public BaseStudent(String name){super(name);//指定调用父类构造函数}//重写public void study(){System.out.println(name+"学习javase..");}}//就业班学生 也是属于普通学生中一种class WorkStudent extends Student{//构造 函数public WorkStudent(String name){super(name);}//重写public void study(){System.out.println(name+"学习javaee+android..");}}class Demo11 {public static void main(String[] args) {//System.out.println("Hello World!");BaseStudent s = new BaseStudent("居东东");s.study();//创建一个就业班的学生WorkStudent w = new WorkStudent("张三");w.study();}}</span>
8.instanceof关键字
1:快速演示instanceof
Personp=new Person();
System.out.println( p instanceof Person);
2:instanceof是什么?
1:属于比较运算符:
2:instanceof关键字:该关键字用来判断一个对象是否是指定类的对象。
3:用法:
对象 instanceof 类;
该表达式是一个比较运算符,返回的结果是boolea类型 true|false
注意:使用instanceof关键字做判断时,两个类之间必须有关系。
<span style="font-family:Microsoft YaHei;font-size:12px;">class Animal{String name;String color;public Animal(String name, String color){this.name = name;this.color = color;}}//狗是属于动物中一种class Dog extends Animal {public Dog(String name,String color){super(name,color); //指定调用父类两个 参数的构造函数。}public void bite(){System.out.println(name+"咬人!!");}}//老鼠 也是属于动物中一种class Mouse extends Animal{public Mouse(String name,String color){super(name,color);}public void dig(){System.out.println(name+"打洞..");}}class Demo12{public static void main(String[] args) {Dog d = new Dog("哈士奇","白色");System.out.println("狗是狗类吗?"+ (d instanceof Dog));System.out.println("狗是动物类吗?"+ (d instanceof Animal));//System.out.println("狗是老鼠类吗?"+ (d instanceof Mouse));// false trueAnimal a = new Animal("狗娃","黄色"); //狗娃是人System.out.println("动物都是狗吗?"+ (a instanceof Dog));}}</span>
- 第8天 静态函数、main方法、单例模式、instanceof
- 2 main、单例模式、继承、instanceof
- Java基础之面向对象(二)--static、静态代码块、Main函数、单例模式
- Java笔记2 面向对象<2>static关键字、main函数、静态运用、单例设计模式
- Java基础之面向对象(二)--static、静态代码块、Main函数、单例模式
- Java面向对象 Main函数 静态的应用 单例设计模式
- Java基础--面向对象(静态、main函数、帮助文档、单例设计模式)
- Java基础---main函数,单例模式
- day06static关键字,main函数,帮助文档的制作,静态代码块,对象的初始化过程,单例设计模式
- static关键字,main函数,帮助文档的制作,静态代码块,对象的初始化过程,单例设计模式
- 单例模式和静态方法
- 单例模式和静态方法比较
- 静态方法、单例模式区别 (转)
- 静态方法、单例模式区别
- 静态方法、单例模式区别
- 单例模式与静态方法
- 单例模式VS静态方法
- 静态方法、单例模式区别
- 磁盘连接
- 拨云见日,理解软件发展中的这些概念
- JQuery中Ajax的操作
- Android 小項目之--消息、線程、動畫顯示圖片
- UC/OSII源码阅读知识点(第一章)
- 第8天 静态函数、main方法、单例模式、instanceof
- Java总结篇系列:Java泛型
- Apache POI导出Excel工具
- mk介绍
- 输入流和输出流的简单应用
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- Docker各文件系统
- activemq + spring 配置内置vm
- 第一个工作项目(5)- 上岗