(一)main方法
jvm调用main方法,jvm也是一个程序
main方法详解:
public:公共 保证该类在任何情况下,jvm都对其方法可见。
static:静态 避免创建对象,而且解决了创建对象传递参数的问题 。
void:没有返回值。jvm调用main方法,即使main方法有返回值,也是返回给jvm,jvm对于这个返回值没有作用。
main:并不是一个关键字,只是jvm识别的一个特殊的标识符,是程序的入口。
args:形参 参数需要在程序一执行的时候就传入。
没有static修饰的后果:
1.java虚拟机调用main方法的时候需要创建对象。
new demo1().main();
2.创建对象时偶尔需要传递参数。
但jvm不知道应该怎样传参,可能会导致错误。new demo1(null);
(二)单例设计模式
模式:解决一类问题的固定步骤。
软件行业23种设计模式:
1.单例设计模式
2.模板设计模式
3.观察者设计模式
4.工厂设计模式
5.代理设计模式
...
单例设计模式:保证一个类在内存中只有一个对象。
饿汉单例设计模式步骤:(推荐使用)
1.私有化构造函数
2.声明本类的引用类型变量,并且创建本类的对象。
3.提供一个公共的方法获取本类的对象。
代码:
class Single
{
//创建本类的对象
private static Single s=new Single();
//私有化构造函数
private Single(){ }
//提供一个公共的方法获取本类的对象
public static Single getInstance(){//加static是因为不能创建对象
return s;
}
}
class demo2
{
public static void main(String[] args)
{
Single s1=Single.getInstance();
Single s2=Single.getInstance();
System.out.println("是同一个对象么?"+(s1==s2));//是同一个对象
}
}
懒汉单例设计模式步骤:
1.私有化构造函数
2.声明变量的引用类型变量,但是先不创建本类的对象
3.提供一个公共静态的方法获取本类的对象,获取之前先判断是否已经创建对象,如果没有创建,那么先创建,再返回,否则直接返回即可。
代码:
class Single2
{
//声明变量的引用类型变量,但是先不创建本类的对象
private static Single2 s;
private Single2(){}
//提供一个公共静态的方法获取本类的对象,获取之前先判断是否已经创建对象,如果没有创建,那么先创建,再返回,否则直接返回即可。
public static Single2 getInstance(){
if(s==null)
s=new Single2();
return s;
}
}
class demo2
{
public static void main(String[] args)
{
Single2 s1=Single2.getInstance();
Single2 s2=Single2.getInstance();
System.out.println("是同一个对象么?"+(s1==s2));//是同一个对象
}
}
懒汉模式存在线程安全问题。
(三)整体与部分
整体与部分的关系:在一个类的内部维护了另一个类的对象。
球队是整体,球员是部分。
例如:
//球员类
class Player
{
int num;//球员编号
String name;//球员名字
//构造函数
public Player(int num,String name){
this.num=num;
this.name=name;
}
public void Play(){
System.out.println("训练好累~~");
}
}
//球队类
class Team
{
String name;//球队名字
Player p1;//球员1
Player p2;//球员2
Player p3;//球员3
//构造方法
public Team(String name,Player p1,Player p2,Player p3){
this.name=name;
this.p1=p1;
this.p2=p2;
this.p3=p3;
}
public void startPlay(){
System.out.println("训练开始啦~~");
}
}
class demo3
{
public static void main(String[] args)
{
Player p1=new Player(10,"小红");
Player p2=new Player(11,"小花");
Player p3=new Player(12,"小明");
//创建一个球队
Team t=new Team("阳光少女",p1,p2,p3);
t.startPlay();
System.out.println("3号球员的名字:"+t.p3.name);
}
}
(四)继承
继承的格式:
class 类名1 extends 类名2{}
继承要注意的细节:
1.子类可以继承父类的成员。但是千万不要为了减少代码重复就继承,只有真正存在继承关系才继承。
2.父类私有的private成员是不能被继承的。
3.父类的构造方法不能被继承。
4.创建子类对象时,默认会先调用父类无参的构造函数。
调用父类的构造方法的作用是为了初始化从父类继承下去的属性。
(五)super关键字
super关键字:
代表的是父类的引用空间,在子类对象的内存空间中。
super的作用:
1.如果子父类存在同名的成员时,在子类中默认访问的是子类的成员,可以通过suoer指定访问父类的成员。
2.创建子类对象时,默认会先调用父类无参的构造函数,this可以在子类构造函数中指定调用父类的构造函数。
super调用父类构造函数的注意细节:
1.super调用父类构造函数时语句必须位于子类构造函数的第一个语句。
2.super(调用父类)、this(调用本类)调用构造函数时不能同时出现在同一个构造函数,因为两者都需要在第一个语句,而第一个语句只有一个。
普通函数中无法调用父类构造函数,子类构造函数中才可以。
(六)方法重写
父类的功能无法满足子类的需求,需要进行方法的重写。
方法重写的前提:两个类存在继承的关系。
方法重写:子父类存在同名的函数。
方法重写要求:
1.方法重写时,子父类函数名必须相同,参数列表也一致。
2.方法重写时,子类的权限修饰符必须要大于或等于父类的权限修饰符。
3.方法重写时,子类的返回值类型必须小于或等于父类的返回值类型。
4.方法重写时,子类抛出的异常类型必须小于或等于父类的类型。
Exception(最大异常)
RunTimeErrorException(较小)
例如:
class Student
{
String name;
int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void study(){
System.out.println(name+"在学习马克思列宁主义");
}
}
class BaseStudent extends Student
{
public BaseStudent(String name,int age){
super(name,age);
}
public void study(){
System.out.println(name+"在学习javaSE");
}
}
class WorkStudent extends Student
{
public WorkStudent(String name,int age){
super(name,age);
}
public void study(){
System.out.println(name+"在学习企业级应用开发");
}
}
class work3
{
public static void main(String[] args)
{
Student s=new Student("老大",20);
s.study();
BaseStudent bs=new BaseStudent("小花",18);
bs.study();
WorkStudent ws=new WorkStudent("小米",19);
ws.study();
//System.out.println("Hello World!");
}
}