Java零基础小白入门课
Java基础入门
最近开发安卓,很多东西不会,都是简书,博客园,csdn博客上看到很多很多人写了各种教程,终于跌跌撞撞把东西给写出来,正好教一个亲戚的朋友零基础Java,也把教程整理一下,做得比较另类,大概适合95后00后肥宅
类和对象
Java的哲学体系中,所有的东西都是对象,所有的对象都属于某一种类
同样属性的对象属于同一种类,类的基础类是Object,其他类都是基础类的衍生,衍生包括了基础类的所有信息,除了private的成员变量
类的成员一般有变量和函数,当然有些是接口什么,以后再说
类的继承
除了Object基础类外,其他类都可以视为某一种类型的子类,包含了父类的private以外所有属性
比如类 人类 class Person
{
public String name="";//最好是字符串直接定义为空字符串,否则引用的时候会报错
}
人类有共同的属性如姓名,出生日期,国籍,身高体重等等
class Man extends Person
class Woman extends Person
可以衍生出两个子类,男人和女人
然后还有各自类特有的,比如男人长胡子,那么Man类里面就有成员变量moustache,表示一个男人的胡子
然后,男人中,有很多屌丝,屌丝也是男人里的一种
屌丝可以写作
class Diaosi extends Man,此处特指男屌丝
{
private Woman girlfriend=null;//屌丝怎么可能有女朋友呢!
}
一般别人项目的写法,成员变量都是private,防止你胡乱修改,当你要获取某个成员变量的时候,你需要获得公开的接口
一般是public接口,这样任何人都可以引用一下就访问,protected就只有自己的子类可以访问,private则只有本对象可以访问,如果不写则是同一包里可以访问
public/不写/protected/private有两个维度的属性,一种是继承,一种是外界访问权限
当我们遇到一个屌丝,我们叫做new一个
Diaosi Diaosi1=new Diaosi();//这就是构造函数,会调用Diaosi{ public Diaosi(){}}这个构造函数,如果调用带参数,那么会自动找相应参数表的函数
Diaosi1就是这个对象的引用地址
当我要问屌丝的女朋友叫什么的时候,就获取屌丝的女朋友这个对象,然后返回这个人的成员变量:名字
就算她的名字是private String name,外界不可访问,那么可以public String getname(){return this.name}来获取
public String askGirlfriendName()
{
return girlfriend.name;
}
调用就是对象名.函数名(参数) Diaosi1.askGirlfriendName();
就比如你要问,屌丝屌丝,你的女朋友叫什么啊,返回的是字符串类型
这句话看上去没问题,但其实是错误的,因为很失礼!
屌丝怎么可能有女朋友呢,屌丝会回复你,找不到对象object,然后程序报错
因为girlfriend==null,所以无法寻找它的成员变量属性,这就是报错的原因
所以,我们问屌丝女朋友叫什么名字,需要礼貌地试探,先问屌丝有没有女朋友,有的话再问对方名字,而不是直接上来就问屌丝女朋友叫什么,不论是说话,还是写程序,都是这个道理
于是我们改写函数
public String askGirlfriendName_v2()
{
if (girlfriend!=null)
return girlfriend.name;
return null;//屌丝没有女朋友,所以你问屌丝的女朋友没有名字,就无法回答你
}
既然是String类型函数,就必须返回字符串(也可以是null),所以当屌丝没有女朋友的时候,他会回复你一个null
当然,屌丝A说我的女朋友是Gakki新垣结衣,屌丝B说好巧啊我绿了你,我的女朋友也是新垣结衣
有个梗就是很多视频都说:你们的女朋友(老婆)新垣结衣,大概全中国有十几万男生号称新垣结衣是他女朋友
PS:B站文章必须要有图,所以不得不找了一张Gakki,不得不说倭妹不符合我审美,挑来挑去一点也不觉得好看,没办法屌丝们熟悉

那么,这个作为一个类的公用成员变量,就涉及到Java的一个基础概念:静态
就是一个类所有成员所共有公用的
屌丝们的女朋友都是新垣结衣,那么首先要有这么一个新垣结衣的女的
public class Woman extends Person{
public static Gakki=new Woman("新垣结衣");//因为Gakki一般就是指新垣结衣
}
这样,Woman就需要一个构造函数,附带一个初始变量,就是名字
当然这个构造函数写在Person里更加科学,因为不论男人女人都有名字,而且一般来说,名字是唯一标识
public class Person{
public Person(String name)
{
this.name=name;//请注意,引用name是当前环境下的变量优先,如果要特指该对象的成员变量,必须加this,this.name表示这个对象的成员变量,name表示当前环境下的name,就是带进来的参数
}
}
这个函数,只要不是private,那么所有它的子类都可以用
那我判断你们两个有没有绿了对方
public boolean bgreenyou(Man man1,Man man2)
{
return man1.girlfriend==man2.girlfriend;//如果两个人的女朋友指向同一个对象,表示这哥俩互相绿了对方
//但是这句话有问题,就是当这两个屌丝都没有女朋友的时候,双方的女朋友都是null,那么也会表示等式相等,两个傻屌丝会开心地以为自己绿了对方,抱歉你们想多了,你们是屌丝!
所以要加and条件
return man1.girlfriend==man2.girlfriend&&man1.girlfriend!=null;
//还可以以双方的名字是否相等来
return (man1.askGirlfriendName_v2().equals(man2.askGirlfriendName_v2());
//这里暂且粗暴地以姓名相同为标准,当两个屌丝的老婆名字相同时,他们就绿了,比如都叫新垣结衣
//此处要说一个知识点,就是在java中,字符串是否内容相等不是C语言里的==,而必须用equals,如果大小写不同也算相等,那么还有equalsIgnoreCase()
//第二个知识点,这一部分也可能报错,因为equals是字符串类的函数,执行这个函数,必须首先有这个对象
//而没有女朋友的屌丝,你问他女朋友叫什么名字,返回的是无,就是null,null并不是一个Object,更不是字符串类型的对象,所以它没有成员变量
//当askGirlfriendName_v2()返回的结果是null,你不能调用null的任何成员变量,所以这一句会报错的,那我们怎么修改呢,看下面
}
public String askGirlfriendName_v3()
{
if (girlfriend!=null)
return girlfriend.name;
return "";//你要确保返回的必须是一个字符串,哪怕是一个空字符串,也能确保程序不报错弹出,这就像屌丝说:我还不知道我女朋友叫什么,也比没有女朋友好
}
后来,屌丝也觉得这样撒谎很没面子,就说自己的女朋友是新垣结衣
这样,当你问起屌丝有没有女朋友的时候,有的屌丝就算没有,也会指着屏幕,说,看,屏幕上面的新垣结衣就是我女朋友
public String askGirlfriendName_v4()
{
if (girlfriend!=null)
return girlfriend.name;//有女朋友的,就告诉对方自己的女朋友叫什么
return Woman.Gakki.name;//没有女朋友的,就说自己的女朋友是新垣结衣
}
静态成员变量的引用方法,是类名.变量名,比如Woman.gakki就是新垣结衣
动态成员变量的引用方法,是对象名.变量名,如上面屌丝,当然在本对象里面,可以写this.或者直接不写
你们(共同)的女朋友,可以这样写
public class Diaosi extends Man{
public static Woman commonGirlfriend=Woman.Gakki;
}
//请注意这里不要写成new Woman("新垣结衣");因为你每new一个就会新增一个对象,而实际上这里指向的是Woman.Gakki,既然对象已经新建,直接引用就可以了,一般不能重新建立两次对象,会产生逻辑错误
如果后来变成了桥本环奈,那么就先要有这么一个人
new Woman("桥本环奈");//这个只执行一次,那么,怎么定位到这个对象呢,我们可以这样写
一种是静态,就像Gakki就是新垣结衣,但问题是桥本环奈似乎没有这种外号,怎么办
public class Woman extends Person{
public static List<Woman> allWomenList=new ArrayList<Woman>();//这是唯一的静态列表
public Woman(String name)
{
this.name=name;
allWomenList.add(this);//把每个new新建的女人都加到静态的女人列表中
}
public static Woman findWomanbyName(String name)
{//暂且粗暴地以名字为唯一互斥标识
for (Woman woman:allWomenList)
if (name.equals(woman.name))//这样写的好处是,参数name是确定的字符串不是null,而woman.name有可能是null,当碰上的时候,如果写woman.name.equals会报错
return woman;
return null;
}
}
//每个类在第一次初始化的时候,所有的static静态的类成员变量都会执行初始化一次
//每个类所属的对象在构造建立的时候,成员变量都会执行一遍
后来,世界上出现了二次元肥宅,他们的老婆是桥本环奈
如果肥宅都是屌丝,屌丝都是男人,那么可以建立多层继承关系
public class Feizhai extends Diaosi{
public static Woman commonGirlFriend=Woman.findWomanbyName("桥本环奈");
}
如果你要说所有屌丝的女朋友一开始都是新垣结衣,然后后来才逐渐换成桥本环奈,那么这样写
public class Diaosi extends Man{
public Woman girlfriend=Woman.Gakki;
}
每个屌丝的女朋友从新垣结衣改成桥本环奈的时候,就是每个diaosi.girlfriend=Woman.findWomanbyName("桥本环奈");
这里的diaosi就必须是对象,而不能是类,如果是类的话
就是:你们的老婆
后来,桥本环奈又成为了中国肥宅们号称的女朋友
Diaosi.commonGirlFriend=Woman.findWomanbyName("桥本环奈");