知识点总结于毕向东Java基础视频教程25天版本,侵权请联系删除。
class Car//对Car这类事物进行描述
{
String color = "red"; int num = 4;
void show()
{
System.out.println("color="+color+"..num="+num);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();//建立对象 c.color = "black";//对对象的属性进行修改 c.show();//使用对象的功能。
}
}
class Demo
{
public static void main(String[] args){
car c=new car();//在栈中加载主函数,主函数中有c并存储在堆中创建好的car对象的地址值,则c指向了对象
showCar(c);//在栈中开辟showCar方法空间,包含方法中的变量。并接收c中对象的地址值,从而也指向同一个在堆中的对象,并修改了对象
showCar(new car());//匿名对象可以作为实际参数进行传递。在堆内存中产生了一个对象并传递给了栈内存中函数showCar()空间中的变量c。即c指向了该对象,所以该对象不是垃圾。等到方法结束,内存释放。
new car().run();//匿名对象,只在堆内存中开辟空间,没有在栈内存中的引用。调用对象中的方法。
}
public static void showCar(car c){
c.wheel=3;
c.color="blue";
c.run();
}
}
class car
{
int wheel=4;
String color="red";
void run(){
System.out.println(wheel+" "+color);
}
}
运行结果:
3 blue
3 blue
4 red
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
1.将变化隔离。
2.便于使用。
3.提高重用性。
4.提高安全性。
封装原则:
–将不需要对外提供的内容都隐藏起来。
– 把属性都隐藏,提供公共方法对其访问。
private关键字
–是一个权限修饰符。
–用于修饰成员(成员变量和成员函数)
–被私有化的成员只在本类中有效。
常用之一:
–将成员变量私有化,对外提供对应的set ,get方法对其进行访问。提高对数据访问的安全性。
特点:
作用:给对象进行初始化。
注意:
作用:给对象进行初始化。
和构造函数的区别:构造代码块是给所有对象进行统一初始化;而构造函数是给对应的对象初始化。
class Demo
{
public static void main(String[] args){
baby babe =new baby();
baby babe1=new baby("张三",1);
}
}
class baby
{
private String name;
private int age;
{//构造代码块,所有对象初始化都会运行
System.out.println("i'm crying...");
}
baby()
{
System.out.println(name+" "+age);
}
baby(String na,int nu)//构造函数重载
{
name=na;
age=nu;
System.out.println(name+" "+age);
}
}
运行结果:
i'm crying...
null 0
i'm crying...
张三 1
什么时候使用this关键字呢?
当在函数内需要调用该函数的对象时,就用this。
class Demo
{
public static void main(String[] args){
baby babe =new baby();
baby babe1=new baby("张三",1);
}
}
class baby
{
private String name;
private int age;
{//构造代码块,所有对象初始化都会运行
System.out.println("i'm crying...");
}
baby()
{
System.out.println(name+" "+age);
}
baby(String name,int age)//构造函数重载
{
/*使用this关键字代表当前对象的成员变量name=局部变量name,
在上面的主函数中创建的两个对象中相当于babe.name=name/babe1.name=name;*/
this.name=name;
this.age=age;
System.out.println(name+" "+age);
}
}
运行结果:
i'm crying...
null 0
i'm crying...
张三 1
this语句:
在带参数的构造函数baby中添加this语句:
baby(String name,int age)//构造函数重载
{
/*
this语句,指代执行当前对象的无参构造函数。
this()相当于baby()
*/
this();
/*使用this关键字代表当前对象的成员变量name=局部变量name,
在上面的主函数中创建的两个对象中相当于babe.name=name/babe1.name=name;*/
this.name=name;
this.age=age;
System.out.println(name+" "+age);
}
运行结果:
i'm crying...
null 0
i'm crying...
null 0
张三 1
注意:要避免两个构造函数之间使用this互相调用对方,这样会导致死循环。
在baby类中添加static修饰的成员变量和成员函数
class Demo
{
public static void main(String[] args){
baby.show();//直接通过类名调用静态方法
}
}
class baby
{
private String name;
private int age;
static String country="china";
{
System.out.println("i'm crying...");
}
baby()
{
System.out.println(name+" "+age);
}
baby(String name,int age)
{
this();
this.name=name;
this.age=age;
System.out.println(name+" "+age);
}
static void show()
{
System.out.println(country); //访问了静态变量
}
}
静态的优点:
静态的缺点:
主函数是一种特殊的函数。作为程序的入口,可以被jvm调用。
主函数的格式是固定的,由jvm识别。
class Demo
{
public static void main(String[] args){
String[] arr={"1","2","3"};
MainTest.main(arr);//调用MainTest类中的主函数
/*在cmd编译好java文件后,在控制台输入java Demo haha并回车,会输出haha。
这是因为虚拟机把类后的数据haha作为做函数的参数赋给了数组args[0]*/
System.out.println(args[0]);
}
}
class MainTest
{
public static void main(String[] args){
for(int i=0;i<args.length;i++)
System.out.println(args[i]);
}
}
每一个程序中都有共性的功能,我们可以将这些功能进行抽取,独立封装以便复用。所以可以将一些方法封装在一个类中。
class Tool
{
Tool(){//构造函数,用于初始化对象
}
public int getMax(int[] arr){
...
}
public int getMin(int[] arr){
...
}
public int sort(int[] arr){
...
}
}
class Demo
{
public static void main(String[] args){
String[] arr={1,45,63,234,33};
Tool tool=new Tool();
tool.getMax(arr);
}
}
但这样就有些问题:
这时就可以考虑让程序更加严谨,该类是不需要对象的。
将方法都静态后,可以方便使用,但是该类还是可以被其它程序建立对象的。为了更加严谨,强制让该类不能建立对象。
class Tool
{
private Tool(){//构造函数私有化
}
public static int getMax(int[] arr){
...
}
public static int getMin(int[] arr){
...
}
public static int sort(int[] arr){
...
}
}
class Demo
{
public static void main(String[] args){
String[] arr={1,45,63,234,33};
Tool.getMax(arr);
}
}
随着类的加载就会执行且执行一次,执行优先级高于构造代码块和类中主函数。
格式:static{}
class Demo
{
public static void main(String[] args){
new StaticCode(4);//创建匿名对象并调用带参构造函数
}
}
class StaticCode
{
int num=9;
StaticCode(){
System.out.println("b");
}
static{ //静态代码块,当类加载时执行,所以优先执行
System.out.println("a");
}
{//构造代码块,当对象被创建时执行,第二个执行
System.out.println("c"+this.num);
}
StaticCode(int x){//构造函数,当对应的对象创建后后执行,最后执行
System.out.println("d");
}
}
执行顺序:
静态代码块/静态变量>构造代码块/成员变量>构造函数
(同级按照代码书写顺序执行)
StaticCode s =new StaticCode();
该句话都做了什么事情?
class Demo
{
public static void main(String[] args){
Person p=new Person("zhangsan",20);
p.setname("lisi");
}
}
class Person
{
private String name;
private int age;
private static String country="china";
Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void speak(){
System.out.println(this.name+" "+this.age);
}
public static coid showCountry(){
System.out.println("country="+country);
}
}
设计模式是解决每一类问题最行之有效的方法。而单例设计模式是解决一个类在内存中只存在一个对象。保证对象唯一性。
对象一进内存直接创建对象。
Single类加载时,对象已经创建。
class Demo
{
public static void main(String[] args){
Single ss= Single.getInstance(); //通过类名调用静态方法获取已经创建的对象的地址
ss.run();
}
}
class Single
{
private Single(){} //构造函数私有化
private static Single s = new Single();//当类加载时创建好唯一对象,设为静态才能被静态方法调用
public static Single getInstance(){//创建可调用的方法返回对象的地址
return s;
}
public static void run(){
System.out.println("hh");
}
}
对象是方法被调用时,才初始化,也叫做对象的延时加载。
single类进内存,对象还没有创建,只有调用了getInstance方法时,才创建对象。
class Single
{
private Single(){}
private static Single s = null;
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
/*
为了避免由于存在多个程序同时调用函数时导致CPU生成多个对象,用synchronized内置锁避免多
个程序内逐一满足条件后再挨个执行创建对象的情况。
*/
if(s==null)
s=new Single();
}
}
return s;
}
public static void run(){
System.out.println("hh");
}
}
总的来说,使用单例模式最终仍会用到对象的调用,所以对象一定会创建,所以饿汉式对于资源占用的较小,优先被使用。