Java基础(零散的记记)
#所有的标识符都应该以字母(A-Z或a-z),美元符(&),或者下划线(_)开始
#首字符之后可以是以上符号或者其他任何字符的组合
#不能使用关键字作为变量名或者方法名
#标识符是大小写敏感的 Man!=man
#标识符可以是中文,但是最好不要是中文
数据类型
Java是强类型语言,要求变量的使用要严格符合规定,所有变量都必须先定义好之后才可以使用
八大基本数据类型
//整数
int num1=10;
byte num2=20;
short num3=30;
long num4=30L; //long类型腰子数字后面加个L
//小数
float num5=50.1F; //float类型要在数字后面加个F
double num63.1415926;
//字符
char name='国';
string namea="张三"; //字符串,String不是关键字,而是类
//布尔值:是否
boolean flag = true;
引用数据类型
除基本数据类型之外的都是引用数据类型
# 类
# 接口
# 数组
拓展
-
整数拓展

-
浮点数拓展(图片中应该是最好不要使用浮点数进行比较)

-
字符拓展
类型转换
-
强制转换:大容量转换小容量的要强制转换 //(类型)变量名
-
自动转换:小容量转换成大容量的会自动转换
变量
-
变量分为成员变量,局部变量
-
成员变量包括类变量、实例变量。
-
类变量可由类或者类的对象访问,生命周期随类的生命周期变化
-
实例变量由类的对象访问
-
成员变量可以自动初始化,其中成员变量是基本数据类型的初始化为“0”或“0.0”,引用类型变量初始化为null;
-
局部变量必须要初始化
常量
初始化后不可以改变值;
修饰符不分顺序,例如:static final int num=0; 等价于 final static int num=0;
运算符
-
关系运算符:instanceof
-
a=1;
b=a++; //b=1 a=2 a先赋值给b,再加1
c=++a; //c=3 a=3 a先加1,再赋值给b -
幂运算:2^3 Math.pow(2,3)
-
X?Y=Z,如果x==true,则结果为y,否则为Z
短路运算
int c=5;
boolean d=(c<4)&&(c++<4);
sout(d); //false
sout(c); //c=5 与运算前面为false,则后面的代码不执行
位运算
//A=0011 1100
//B=0000 1101
A&B=0000 1100
A|B=0011 1101
A^B=0011 0001 //异或,相同为0
~B= 1111 0010 //取反
包机制
一般用公司的域名倒置作为报名,如com.baidu.wenku.www
可变参数
-
在方法的声明中,在指定参数类型后加一个省略号(...)
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通参数必须在他之前声明。
递归结构
-
递归头:什么时候不调用自身方法
-
多态
多态跟属性无关,多态指的是方法的多态,而不是属性的多态
public class Animal {//父类:动物
public void shout(){
System.out.println("我是小动物 ");
}
}
public class Cat extends Animal {//子类:猫
public void shout(){
System.out.println("我是小猫 ");
}
}
public class Dog extends Animal {//子类:狗
public void shout(){
System.out.println("我是小狗 ");
}
}
public class Girl {
public void play(Animal an){
an.shout();
}
}
public class Test{
public static void main(String args[]){
Girl g = new Girl();
Aniaml an=new Dog();
g.play(an);
}
}
-
多态就是多个状态,同一种行为,不同子类表现为不同状态。指的就是同一个方法调用,然而由于对象的不同会产生不同的行为。具体场景:
(一)父类当方法的形参,然而传入的是子类的对象,调用同一个方法,就会根据传入的子类不同而产生不同的效果。
(二)父类作为方法的返回值类型,真是返回的是该类的任意一个子类的对象。(简单工厂模式)
-
提高了代码的拓展性,符合面向对象的设计原则:开闭原则(拓展是开放的推荐的,修改是关闭的)。
-
多态的要素:1.继承 2.重写:子类对父类的方法重写 3,父类引用指向子类对象
向上转型和向下转型
Dog类添加一个自己独有的方法时,多态的情况下会报错。
public class Dog extends Animal {//子类:狗
public void shout(){
System.out.println("我是小狗 ");
}
public void eat(){
System.out.println("吃狗粮");
}
}
public class Test{
public static void main(String args[]){
Aniaml an=new Dog();
an.shout();
an.eat();//报错 ,Animal类中没有eat()方法
}
}
报错原因:
(1)Animal an = new Dog(); 左边:编译期的类型 右边:运行期的类型
an在编译期的时候是Animal类型,Animal类没有eat()方法。
(2)内存:
an只能访问到pig对象中Animal部分的内容
解决方法:将Animal类型转为Dog类型
public class Test{
public static void main(String args[]){
Aniaml an=new Dog();//向上转型
an.shout();
an.eat();//报错 ,Animal类中没有eat()方法
Dog dog =(Dog)an;//向下转型 为了获取子类特有的内容
dog.shout();
dog.eat();
}
}
从上面的代码可以看出,(1)Aniaml an=new Dog(),an在编译期的类型是Animal,但是运行期指向的是Dog类型,所以an.eat()会报错(2)Dog dog =(Dog)an; dog在编译期类型为Dog,而右边的an运行期类型指向的是Dog类型,所以没报错。
简单工厂模式
简单工厂模式的实现,他是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用就可以了。简单工厂模式的基本要求是:
-
定义一个static方法,通过类名直接调用
-
返回值类型是父类类型,返回的可以是其任意子类类型
-
传入一个字符串类型的参数,工厂根据参数创建对应的子类产品
public class PetStore{
public static Animal getAnimal(String petName){
Animal an = null;
if("猫".equals(petName)){
an = new Cat();
}
if("狗".equals(petName)){
an = new Dog();
}
return an;
}
}
public class Test{
public static void main(String args[]){
Girl g = new Girl();
Aniaml an=PetStore.getAnimal("猫");
g.play(an);
}
}
final关键字
一、修饰变量
public class Test{
public static void main(String[] args){
final int A = 10;//fianl修饰基本数据类型,变量的值不变
//A=20; //报错,不可以修改值
final Dog d =new Dog(); //fianl修饰引用数据类型,地址值不可以改变
//d = new Dog(); //报错,地址值不可以改变
d.age=10;//d对象的属性依然可以改变,不受影响
test(d);
}
public static void test(final Dog d){
//d=new Dog(); //报错,因为d被final修饰了,方法被调用时传来的参数第一次赋了地址值就不可以改变了
}
}
二、修饰方法
final 修饰方法,那么该方法的子类无法重写该方法
三、修饰类
final修饰类,代表没有子类,该类无法被继承。
一旦一个类被final修饰,那么里面的方法也没必要用final修饰了(没子类就没有重写这一说)
抽象类_抽象方法
//4.一个类中如果有方法是抽象方法,那么这个类也要变成抽象类
//5.抽象类可以有0-n个抽象方法
public abstract class Person{
//1.在一个类中,会有一类方法,子类对他永远满意,不会重写,直接使用
public void eat(){
System.out.pringln("一顿不吃饿得慌");
}
//2.在一个类中,会有一类方法,子类对他永远不满意,会重写他,那么这个方法的方法体就没意义了
//因为子类会重写他。这时候需加上abstract修饰
//3.一个方法的方法体去掉,然后被abstract修饰,那么这个方法就变成了一个抽象方法
public void say();
}
//6.抽象类可以被其他类继承。
//7.一个类继承了一个抽象类,那么该类也可以变成一个抽象类
//8.一般子类不加abstract修饰,一般让子类重写父类全部的抽象方法
class Student extends Person{
public void say(){
System.out.pringln("阿巴阿巴。。");
}
}
public class Test{
public static void main(String args[]){
//Person p=new Perosn(); //报错,抽象类不可以实例化
}
}
抽象类的作用
抽象类定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以重写拓展自己的内容,又避免了子类设计的随意性
面试题
【1】抽象类不能创建对象,那么抽象类中是否有构造器?
抽象类中一定有构造器,构造器的作用:给子类初始化对象的时候要先super调用父类的构造器
【2】抽象类是否可以被final修饰?
不能被final稀释,因为抽象类设计的初衷就是给子类继承用的。
接口
-
类是类,接口是接口,他们是同一层级的概念
-
接口没有构造器
-
接口声明:interface
-
在JDK1.8之前,接口只有两个部分内容:
(1)常量:固定修饰符:public static final
(2)抽象方法:固定修饰符:public abstract
这些固定修饰符可省略不写
-
类和接口的关系是什么? 实现关系 ,类实现接口
-
一旦实现一个接口,那么实现类要重写接口中的全部抽象方法
-
如果没有全部重写抽象方法,那么这个类可以加上abstract变成一个抽象类
-
Java有单继承,多实现,只能继承一个类,可实现多个接口
-
在JDK2.8之后,新增了非抽象方法:
(1)被public default修饰的非抽象方法
注意1;default 修饰符必须加上
注意2:在实现类中,重写的非抽象方法不可以加default
(2)静态方法
注意1:static不能省略
注意2:静态方法不能重写,所以实现类中的同名静态方法不是重写,而是实现类中你自己独有的一个静态方法
public interface TestInterface{
//public default非抽象方法
public default void b(){//加上default
System.out.println("---b---");
}
//静态方法
public static void c(){
System.out.println("---c---");
}
}
class Test implements TestInterface{
public void b(){//去掉default
System.out.println("重写b方法");
}
}
问题:接口中为什么要添加非抽象方法?
如果接口中只能定义抽象方法的话,如果要修改接口中的内容,呢么对实现类的影响太大了,现在在接口中可以加入抽象方法,对实现类没有影响,像调用就调用即可。
内部类
内部类:成员内部类(静态的,非静态的) 和 局部内部类(位置:方法内,块内,构造器内)
public class TestOuter{
int age=10;
int tall=155;
public void a(){
System.out.println("这是方法a");
D d = new D();
//3.外部类想要访问内部类的东西需要创建内部类的对象
System.out.println(d.name);
d.method();
}
//成员内部类
public class D{
String name;
int tall=166;
public void method(){
//1.内部类可以访问外部类的内容
System.out.println(age);
a();
int tall=188;
//4.内部类和外部类属性重名时,如何调用:
System.out.println(tall);//188
System.out.println(this.tall);//166
System.out.println(TestOuter.this.tall);//155
}
}
//静态内部类
static class E{
public void method(){
//2.静态内部类只能访问外部类中被static修饰的内容
//System.out.println(age); //报错
//a(); //报错
}
}
}
class Demo{
//静态成员内部类闯将对象
TestOuter.E e=new TestOuter.E();
//非静态成员内部类创建对象
TestOuter t = new TestOuter();
TestOuter.D d = t.new D();
}



浙公网安备 33010602011771号