《Java面试突击》--leetbook
概念:
面向过程:分解成步骤并执行函数--数据分离-优点性能高不需要实例化,缺点不容易复用维护和扩展
面向对象:分解成对象-描述步骤中的行为,对象属性行为关联
优点:封装,继承,多态特性
维护,复用,扩展,低耦合系统,缺点实例化性能没有过程高
对象:现实世界的实体,有状态和行为
状态:数据域的集合
行为:方法的集合
类:定义同一类对象的结构,创建对象成为实例化
对象和类:
对象是类的具体实例,独有状态和行为
类是具有相同特征的对象的抽象,用来定义对象的状态和行为
一个类创建多个对象
Classes and Objects in Java - GeeksforGeeks
构造方法:
构造方法-初始化
类名称相同-可以重载(不同的参数列表)
new 调用构造方法(成为方法而不是函数)
默认构造方法--没有参数,存在不需要显性声明的对象的时候就需要默认构造方法
没有返回类型包括void
构造方法的作用-如何调用-初始化-new
是否可以重载-yes
什么是默认构造方法-什么情况下会有默认构造方法-无参数-存在需要声明无参数对象
构造方法是否有返回值-no
静态和实例
类成员-方法,成员变量可以是静态或者实例的
static修饰的是静态的否则是实例的
1.外部调用
外部调用静态的类成员的时候,可以类名或者被对象调用
Object.method(), obj.method()
而外部调用实例,只能使用对象名
obj.method()
String s = String.format("My Company name is %s", str); System.out.println(s);
String, str都可以调用format, 但是length(),只能str
但是静态的增加可读性,全部使用类名调用
内部访问
静态方法只能访问静态成员,不能访问实例成员
实例方法既可以访问实例的类成员也可以访问静态的
因此public static void main(String[] args){} 只能调用静态的, static int a =1;
实例的必须创建对象才存在,因此静态的只能调用静态的
比如length依赖具体的实例,所以应该为实例的成员
而format, math都不依赖于实例,因此都是静态的
?从外部调用类成员,静态和实例的成员分别通过什么调用---类名和实例, 实例
?从内部访问类成员,实例和静态方法是否都可以访问静态的--对, 但是静态不可以访问实例的;
初始化块
Java 初始化块_w3cschool
public class Solution { static { System.out.println("Initializer 1"); } public static void main(String[] args){ String str = "123"; System.out.println(str); } }
因为Solution.java直接运行,所以其实是没有实例化的,直接调用的是静态的main方法,正好也是静态的的方法,因此初始化块也应该用静态的,加上大括号,里面是初始化块语句
类第一次被加载的时候执行静态初始化块然后执行main方法,实例初始化块则是每一次被创建的时候执行;
它用于初始化一个类。每个对象执行一个实例初始化器,而当类定义被加载到JVM中时,只对一个类执行一次静态初始化器。
注意,实例初始化程序在实例上下文中执行,并且关键字this在实例初始化程序中可用。
//initializer int num; { this.num = 101; }
关键字this
关键字this代表当前对象的引用,
当属性名和参数名一样的时候,this.var = var
否则就可以省略掉
https://www.yiibai.com/java/this-keyword.html
this默认添加到方法中调用其他方法的前面
3. this调用其他构造函数
class Student { int rollno; String name, course; float fee; Student(int rollno, String name, String course) { this.rollno = rollno; this.name = name; this.course = course; } Student(int rollno, String name, String course, float fee) { this(rollno, name, course);// reusing constructor this.fee = fee; } }
实际上就是复用其他的构造函数,this(参数),这样就可以减少代码,相当于python的super
this代指的是对象本身,因此不能用于静态方法,初始化块中
又或者
class Square{ int side; public Square(){ this(1); } public Square(int side){ this.side = side; } }
这样子相当于无参数的时候可以给一个默认值1,这样初始化没有参数也可以;
因为如果存在new Square(),就必须有默认构造函数,
关键字this的含义:
代表当前对象的引用,当前对象指的是调用类中的属性或方法的对象
this在方法和构造方法中代表引用对象的属性,也可以在构造方法中调用其他构造方法
不可以用于静态方法-因为是对象的引用
可见性修饰符和数据域封装
可见性修饰符public表示类成员可以控制对类成员的访问。
包括public----- 类成员可以在任何类中访问-不同包也可以
private---- 只能访问自身类中的成员
protected --继承与多态
默认修饰符---同一个包里面任何类中访问-包内访问
Java成员详解-Java成员概念大全_刘金宝_Arvin的博客-CSDN博客_java 成员
java基础:4.2 对象和类(二)、数据域封装、this - Aurora_l - 博客园
数据域设为私有域--private int radius = 1;
通过get 和 set来访问和修改;
字符串:
Java包括String, StringBuffer, 和StringBuilder
String:使用数组存储字符串的内容,使用关键词final修饰,因此数组内容不可变
因此每次修改都会创建新的String对象,导致效率低下且占用大量内存空间
StringBuffer 和 StringBuilder
使用数组存储但是没有final修饰,内容可变,修改不会创建新的对象,
StringBuffer: 对定义的方法或者调用的方法使用关键词synchronized修饰,同步锁会影响效率,但是多线程StringBuilder会不安全
StringBuilder没有同步锁
继承
父类-派生子类--继承。子类一般拥有更多类成员
如果没有指定继承,父类默认为object
Java 继承 | 菜鸟教程
public class Mouse extends Animal { public Mouse(String myName, int myid) { super(myName, myid); //必须第一个语句 } }
class Animal { String color = "white"; } class Dog extends Animal { String color = "black"; void printColor() { System.out.println(color);// prints color of Dog class System.out.println(super.color);// prints color of Animal class } }
可以